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 IFinstrução deve terminar comEND IFe um ponto e vírgula, não apenasEND- você precisa alterar um delimitador com
DELIMITERcomando - 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 INFILEpara preencher a tabela de preparo - ter
tblspmastere a tabela de preparo e usandoINSERT ... SELECTsintaxe insira todas as duplicatas emtblspduplicatede uma só vez - inserir apenas linhas inexistentes da tabela de preparo em
tblspmasternovamente de uma só vez TRUNCATEouDROPtabela de preparação