Hvad angår din trigger, er der flere problemer:
- du har ikke
;efter indsæt erklæring IFsætningen skal slutte medEND IFog et semikolon, ikke kunEND- du skal ændre et skilletegn med
DELIMITERkommando - brug
EXISTS()i stedet forCOUNT()
Når det er sagt, kan din trigger se ud
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 ;
Her er SQLFiddle demo
Brug IGNORE klausul i din LOAD DATA INFILE udmelding. MySql vil behandle fejl (overtræder unik begrænsning) som advarsler, der effektivt kasserer dubletter.
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
Bemærk: FYI mislykkede indsættelser for duplikerede rækker vil efterlade huller i værdierne for auto_increment SCN kolonne.
Du kan overveje en anden tilgang, som måske er mere at foretrække i forhold til ydeevnen:
- opret en midlertidig iscenesættelsestabel uden begrænsninger og ingen indekser
- brug
LOAD DATA INFILEfor at udfylde iscenesættelsestabellen - har
tblspmasterog iscenesættelsestabellen og ved at brugeINSERT ... SELECTsyntaks indsæt alle dubletter itblspduplicatepå én gang - indsæt kun ikke-eksisterende rækker fra iscenesættelsestabellen i
tblspmasterigen på én gang TRUNCATEellerDROPiscenesættelsesbord