Що се отнася до задействането, има няколко проблема:
- нямате
;след изявление за вмъкване IFоператорът трябва да завършва сEND IFи точка и запетая, а не самоEND- трябва да промените разделител с
DELIMITERкоманда - използвайте
EXISTS()вместоCOUNT()
Като се има предвид това, спусъкът ви може да изглежда като
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 ;
Ето SQLPiddle демонстрация
Използвайте IGNORE клауза във вашия LOAD DATA INFILE изявление. MySql ще третира грешките (нарушаващи уникалното ограничение) като предупреждения, ефективно изхвърляйки дубликати.
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
Забележка: FYI неуспешните вмъквания за дублиращи се редове ще оставят празнини в стойностите на auto_increment SCN колона.
Може да помислите за друг подход, който може да е по-предпочитан по отношение на производителността:
- създайте временна промежуточна таблица без ограничения и без индекси
- използвайте
LOAD DATA INFILEза попълване на таблицата за етапи - има
tblspmasterи стадийната таблица и с помощта наINSERT ... SELECTсинтаксис вмъкване на всички дубликати вtblspduplicateнаведнъж - вмъкнете само несъществуващи редове от таблицата на етапа в
tblspmasterотново наведнъж TRUNCATEилиDROPпостановка таблица