Wat betreft je trigger zijn er verschillende problemen:
- je hebt geen
;
na invoegopdracht IF
statement moet eindigen opEND IF
en een puntkomma, niet alleenEND
- je moet een scheidingsteken wijzigen met
DELIMITER
commando - 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 INFILE
om de verzameltabel te vullen - met
tblspmaster
en de staging-tabel en met behulp vanINSERT ... SELECT
syntaxis plaats alle duplicaten intblspduplicate
in één keer - voeg alleen niet-bestaande rijen uit de staging-tabel in
tblspmaster
in weer in één keer TRUNCATE
ofDROP
verzameltafel