Wat betreft je trigger zijn er verschillende problemen:
- je hebt geen
;na invoegopdracht IFstatement moet eindigen opEND IFen een puntkomma, niet alleenEND- je moet een scheidingsteken wijzigen met
DELIMITERcommando - gebruik
EXISTS()in plaats vanCOUNT()
Dat gezegd hebbende, zou je trigger eruit kunnen zien als
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 ;
Hier is SQLFiddle demo
Gebruik IGNORE clausule in uw LOAD DATA INFILE uitspraak. MySql behandelt fouten (die de unieke beperking schenden) als waarschuwingen die duplicaten effectief weggooien.
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
Opmerking: Ter info:mislukte invoegingen voor dubbele rijen laten gaten achter in de waarden van auto_increment SCN kolom.
U kunt een andere benadering overwegen die qua prestaties wellicht beter is:
- maak een tijdelijke staging-tabel zonder beperkingen en zonder indexen
- gebruik
LOAD DATA INFILEom de verzameltabel te vullen - met
tblspmasteren de staging-tabel en met behulp vanINSERT ... SELECTsyntaxis plaats alle duplicaten intblspduplicatein één keer - voeg alleen niet-bestaande rijen uit de staging-tabel in
tblspmasterin weer in één keer TRUNCATEofDROPverzameltafel