2010-10-07 20 views

Respuesta

8

Si desea considerar el uso de un procedimiento almacenado, se puede utilizar un DECLARE CONTINUE HANDLER Aquí está un ejemplo:

CREATE TABLE users (
    username VARCHAR(30), 
    first_name VARCHAR(30), 
    last_name VARCHAR(30), 
    PRIMARY KEY (username) 
); 

CREATE TABLE audit_table (timestamp datetime, description varchar(255)); 

DELIMITER $$ 
CREATE PROCEDURE add_user 
     (in_username VARCHAR(30), 
     in_first_name VARCHAR(30), 
     in_last_name VARCHAR(30)) 
    MODIFIES SQL DATA 
BEGIN 
    DECLARE duplicate_key INT DEFAULT 0; 
    BEGIN 
     DECLARE EXIT HANDLER FOR 1062 SET duplicate_key = 1; 

     INSERT INTO users (username, first_name, last_name) 
       VALUES (in_username, in_first_name, in_last_name); 
    END; 

    IF duplicate_key = 1 THEN 
     INSERT INTO audit_table VALUES(NOW(), 'Duplicate key ignored'); 
    END IF; 
END$$ 
DELIMITER ; 

Vamos a añadir algunos datos, tratando de insertar una clave duplicada:

CALL add_user('userA', 'Bob', 'Smith'); 
CALL add_user('userB', 'Paul', 'Green'); 
CALL add_user('userA', 'Jack', 'Brown'); 

Resultado:

SELECT * FROM users; 
+----------+------------+-----------+ 
| username | first_name | last_name | 
+----------+------------+-----------+ 
| userA | Bob  | Smith  | 
| userB | Paul  | Green  | 
+----------+------------+-----------+ 
2 rows in set (0.00 sec) 

SELECT * FROM audit_table; 
+---------------------+-----------------------+ 
| timestamp   | description   | 
+---------------------+-----------------------+ 
| 2010-10-07 20:17:35 | Duplicate key ignored | 
+---------------------+-----------------------+ 
1 row in set (0.00 sec) 

Si la auditoría es importante a nivel de base de datos, es posible que desee otorgar EXECUTE permisos solo para que los usuarios de la base de datos solo puedan llamar a procedimientos almacenados.

+0

Un procedimiento almacenado o disparador (como propuso MatTheCat) resolverá este problema, pero la mayoría de los proveedores de alojamiento no aceptarán SP o desencadenantes en sus servidores, no sé por qué, supongo que algún tipo de seguridad problema. – ricardocasares

+0

@ricardocasares: Lo consideraría una oportunidad para cambiar de proveedores de alojamiento :) –

+0

Muchas gracias Daniel !! Consideraré cambiar el alojamiento;) y muchas gracias por ese gran ejemplo. – ricardocasares

0

EN llave duplicada se utiliza para actualizar la fila, no insertar en otra tabla, que tiene que utilizar dos consultas de acuerdo con el primer resultado

EDIT:.. se puede utilizar un disparador demasiado

+0

"tiene que usar dos consultas según el resultado del primero". ¿Puedes explicar un poco más o darme un ejemplo de esto? ¡Muchas gracias! – ricardocasares

+0

Olvidó esto, debería usar PHP ^^ 'Use un disparador o pruebe la solución de Daniel. – MatTheCat

+0

Gracias por sus respuestas Mat;) – ricardocasares

0

No estoy seguro si esto iba a funcionar, pero mirar en instrucción IF para MySQL

Pseudocódigo

IF(SELECT id_key_index FROM tbl WHERE id_key_index = $index) THEN (UPDATE SECOND TBL); 
    ELSE 
     INSERT ... 
    END IF; 
+0

Gracias Phill, lo intentaré! – ricardocasares

Cuestiones relacionadas