Jeśli chodzi o wyzwalanie, istnieje kilka problemów:
- nie masz
;
po instrukcji insert IF
instrukcja powinna kończyć sięEND IF
i średnik, a nie tylkoEND
- musisz zmienić ogranicznik za pomocą
DELIMITER
polecenie - 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 INFILE
wypełnić tabelę pomostową - posiadanie
tblspmaster
i tabelę pomostową i używającINSERT ... SELECT
składnia wstawia wszystkie duplikaty wtblspduplicate
za jednym zamachem - wstaw tylko nieistniejące wiersze z tabeli pomostowej do
tblspmaster
ponownie za jednym razem TRUNCATE
lubDROP
stół inscenizacyjny