2012-08-13 34 views
7

entiendo que existe INSERT IGNORE y INSERT ... ON DUPLICATE KEY UPDATE. Sin embargo, cuando hay una copia de la llave, me gustaría hacer un INSERT a una tabla temporal para mantener un registro de la clave única que ha sido violado, por lo que puede dar salida al usuario.MySQL - EN llave duplicada INSERT

¿Hay alguna manera de que pueda hacer un ON DUPLICATE INSERT? Si ayuda, estoy tratando de hacer una inserción masiva.

+0

posible duplicado de [MySQL en una llave duplicada insertar en una tabla de auditoría o registro] (http://stackoverflow.com/questions/3884344/mysql-on-duplicate-key-insert-into-an-audit-or-log-table) –

Respuesta

7

Con ON DUPLICATE KEY UPDATE, no se puede insertar en otra tabla - tampoco hay una función alternativa disponible.

Dos personalizadas/formas alternativas que puede lograr esto:

  1. El uso de un stored procedure como se indica en la respuesta aceptada a esta pregunta: MySQL ON DUPLICATE KEY insert into an audit or log table

  2. Creación de una trigger que registra cada INSERT para su mesa en otra mesa y consultar la tabla completa de los "troncos" para los duplicados.

Algo similar a esto debería funcionar:

CREATE TABLE insert_logs (
    id int not null 
); 

delimiter | 
CREATE TRIGGER insert_logs_trigger BEFORE INSERT ON your_table 
    FOR EACH ROW BEGIN 
     INSERT INTO insert_logs SET id = NEW.id; 
    END; 
| 

Para obtener una lista de los duplicados en la tabla, nos pudiera:

SELECT id FROM insert_logs HAVING COUNT(id) > 1 GROUP BY id; 
+0

Esto es muy útil, gracias ! :) – matt

Cuestiones relacionadas