En lo que respecta a los disparadores, hay varios problemas:
- no tienes
;
después de insertar declaración IF
declaración debe terminar conEND IF
y un punto y coma, no soloEND
- tienes que cambiar un delimitador con
DELIMITER
comando - 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 INFILE
para llenar la tabla de preparación - tener
tblspmaster
y la tabla de etapas y usandoINSERT ... SELECT
sintaxis insertar todos los duplicados entblspduplicate
de una vez - insertar solo filas inexistentes de la tabla de preparación en
tblspmaster
de nuevo de una vez TRUNCATE
oDROP
mesa de escenario