En lo que respecta a los disparadores, hay varios problemas:
- no tienes
;después de insertar declaración IFdeclaración debe terminar conEND IFy un punto y coma, no soloEND- tienes que cambiar un delimitador con
DELIMITERcomando - usa
EXISTS()en lugar deCOUNT()
Dicho esto, su gatillo podría verse como
DELIMITER $$
CREATE TRIGGER tblspmaster_noduplicate
BEFORE INSERT ON tblspmaster
FOR EACH ROW
BEGIN
IF (EXISTS(SELECT * FROM tblspmaster WHERE sp = NEW.sp)) THEN
INSERT INTO tblspduplicate (sp,FileImported,AMZFileName)
VALUES (NEW.sp, NEW.FileImported, NEW.AMZFileName);
END IF;
END$$
DELIMITER ;
Aquí está SQLFiddle demostración
Usa IGNORE cláusula en su LOAD DATA INFILE declaración. MySql tratará los errores (que violen la restricción única) como advertencias y descartará efectivamente los duplicados.
LOAD DATA LOCAL INFILE 'E://31october//SP//sp_files_sample1//400k sp00 6-19 E.csv'
IGNORE
INTO TABLE tblspmaster
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY '\n'
-- IGNORE 1 LINES
SCN columna.
Puede considerar otro enfoque que podría ser más preferible en cuanto a rendimiento:
- crear una tabla provisional temporal sin restricciones ni índices
- use
LOAD DATA INFILEpara llenar la tabla de preparación - tener
tblspmastery la tabla de etapas y usandoINSERT ... SELECTsintaxis insertar todos los duplicados entblspduplicatede una vez - insertar solo filas inexistentes de la tabla de preparación en
tblspmasterde nuevo de una vez TRUNCATEoDROPmesa de escenario