Jeśli chodzi o wyzwalanie, istnieje kilka problemów:
- nie masz
;po instrukcji insert IFinstrukcja powinna kończyć sięEND IFi średnik, a nie tylkoEND- musisz zmienić ogranicznik za pomocą
DELIMITERpolecenie - użyj
EXISTS()zamiastCOUNT()
Powiedziawszy to, twój wyzwalacz może wyglądać tak
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 ;
Oto SQLFiddle demo
Użyj IGNORE klauzula w LOAD DATA INFILE oświadczenie. MySql potraktuje błędy (naruszenie ograniczenia unikatowego) jako ostrzeżenia skutecznie odrzucające duplikaty.
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
Uwaga: Nieudane wstawienie FYI dla zduplikowanych wierszy spowoduje pozostawienie przerw w wartościach auto_increment SCN kolumna.
Możesz rozważyć inne podejście, które może być bardziej korzystne pod względem wydajności:
- utwórz tymczasową tabelę pomostową bez ograniczeń i indeksów
- użyj
LOAD DATA INFILEwypełnić tabelę pomostową - posiadanie
tblspmasteri tabelę pomostową i używającINSERT ... SELECTskładnia wstawia wszystkie duplikaty wtblspduplicateza jednym zamachem - wstaw tylko nieistniejące wiersze z tabeli pomostowej do
tblspmasterponownie za jednym razem TRUNCATElubDROPstół inscenizacyjny