In Bezug auf Ihren Trigger gibt es mehrere Probleme:
- Sie haben
;
nicht nach der Insert-Anweisung IF
sollte mitEND IF
enden und ein Semikolon, nicht nurEND
- Sie müssen ein Trennzeichen mit
DELIMITER
ändern Befehl - benutze
EXISTS()
stattCOUNT()
Davon abgesehen könnte Ihr Trigger so aussehen
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 ist SQLFiddle Demo
Verwenden Sie IGNORE
-Klausel in Ihrem LOAD DATA INFILE
Erklärung. MySql behandelt Fehler (die die Eindeutigkeitsbeschränkung verletzen) als Warnungen und verwirft effektiv Duplikate.
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
Hinweis: Zu Ihrer Information, fehlgeschlagene Einfügungen für doppelte Zeilen hinterlassen Lücken in den Werten von auto_increment SCN
Spalte.
Sie können einen anderen Ansatz in Betracht ziehen, der in Bezug auf die Leistung möglicherweise vorzuziehen ist:
- temporäre Staging-Tabelle ohne Einschränkungen und ohne Indizes erstellen
- benutze
LOAD DATA INFILE
Staging-Tabelle zu füllen - mit
tblspmaster
und der Staging-Tabelle und mitINSERT ... SELECT
Syntax alle Duplikate intblspduplicate
einfügen auf einmal - Füge nur nicht vorhandene Zeilen aus der Staging-Tabelle in
tblspmaster
ein wieder in einem Zug TRUNCATE
oderDROP
Staging-Tabelle