När det gäller utlösaren finns det flera problem:
- du har inte
;efter infoga uttalande IFuttalandet ska sluta medEND IFoch ett semikolon, inte baraEND- du måste ändra en avgränsare med
DELIMITERkommando - 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 INFILEför att fylla i mellantabell - har
tblspmasteroch mellanställningstabellen och medINSERT ... SELECTsyntax infoga alla dubbletter itblspduplicatei ett svep - infoga endast obefintliga rader från staging-tabellen i
tblspmasterigen i ett svep TRUNCATEellerDROPmellanställningsbord