När det gäller utlösaren finns det flera problem:
- du har inte
;
efter infoga uttalande IF
uttalandet ska sluta medEND IF
och ett semikolon, inte baraEND
- du måste ändra en avgränsare med
DELIMITER
kommando - använd
EXISTS()
istället förCOUNT()
Med det sagt kan din trigger se ut
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 ;
Här är SQLFiddle demo
Använd IGNORE
sats i din LOAD DATA INFILE
påstående. MySql kommer att behandla fel (som bryter mot unika begränsningar) som varningar som effektivt kasserar dubbletter.
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
Obs! FYI misslyckade infogningar för dubbletter av rader kommer att lämna luckor i värdena för auto_increment SCN
kolumn.
Du kan överväga ett annat tillvägagångssätt som kan vara mer att föredra prestandamässigt:
- skapa en temporär mellanställningstabell utan begränsningar och inga index
- använd
LOAD DATA INFILE
för att fylla i mellantabell - har
tblspmaster
och mellanställningstabellen och medINSERT ... SELECT
syntax infoga alla dubbletter itblspduplicate
i ett svep - infoga endast obefintliga rader från staging-tabellen i
tblspmaster
igen i ett svep TRUNCATE
ellerDROP
mellanställningsbord