Hvad angår din trigger, er der flere problemer:
- du har ikke
;
efter indsæt erklæring IF
sætningen skal slutte medEND IF
og et semikolon, ikke kunEND
- du skal ændre et skilletegn med
DELIMITER
kommando - 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 INFILE
for at udfylde iscenesættelsestabellen - har
tblspmaster
og iscenesættelsestabellen og ved at brugeINSERT ... SELECT
syntaks indsæt alle dubletter itblspduplicate
på én gang - indsæt kun ikke-eksisterende rækker fra iscenesættelsestabellen i
tblspmaster
igen på én gang TRUNCATE
ellerDROP
iscenesættelsesbord