Що се отнася до задействането, има няколко проблема:
- нямате
;
след изявление за вмъкване 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
постановка таблица