Pregunta

¿Hay una manera de lograr esto?

INSERT IGNORE INTO some_table (one,two,three) VALUES(1,2,3)
ON DUPLICATE KEY (INSERT INTO audit_table VALUES(NOW(),'Duplicate key ignored')

Realmente no quiero usar PHP para esto: (

Gracias!

¿Fue útil?

Solución

Si desea considerar el uso de un procedimiento almacenado, se puede utilizar un DECLARE CONTINUE HANDLER . He aquí 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');

Resultados:

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 desea conceder permisos EXECUTE única para que sus usuarios de bases de datos sólo puede llamar a los procedimientos almacenados.

Otros consejos

ON llave duplicada se utiliza para actualizar la fila, no para insertar en otra tabla, usted tiene que utilizar dos consultas de acuerdo con los primeros de resultado.

EDIT: se puede utilizar un disparador demasiado

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

Pseudo-código

IF(SELECT id_key_index FROM tbl WHERE id_key_index = $index) THEN (UPDATE SECOND TBL);
    ELSE
      INSERT ...
    END IF;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top