No que diz respeito ao gatilho em questão, existem vários problemas:
- você não tem
;
após a instrução de inserção IF
instrução deve terminar comEND IF
e um ponto e vírgula, não apenasEND
- você precisa alterar um delimitador com
DELIMITER
comando - use
EXISTS()
em vez deCOUNT()
Dito isto, seu gatilho pode parecer
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 ;
Aqui está SQLFiddle demonstração
Use
IGNORE
cláusula em seu LOAD DATA INFILE
demonstração. O MySql tratará os erros (violando a restrição exclusiva) como avisos efetivamente descartando duplicatas. 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
Observação: Inserções com falha FYI para linhas duplicadas deixarão lacunas nos valores de auto_increment
SCN
coluna. Você pode considerar outra abordagem que pode ser mais preferível em termos de desempenho:
- criar tabela de preparo temporária sem restrições e sem índices
- use
LOAD DATA INFILE
para preencher a tabela de preparo - ter
tblspmaster
e a tabela de preparo e usandoINSERT ... SELECT
sintaxe insira todas as duplicatas emtblspduplicate
de uma só vez - inserir apenas linhas inexistentes da tabela de preparo em
tblspmaster
novamente de uma só vez TRUNCATE
ouDROP
tabela de preparação