Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

antes de inserir o gatilho para inserir linhas duplicadas em outra tabela


No que diz respeito ao gatilho em questão, existem vários problemas:
  1. você não tem ; após a instrução de inserção
  2. IF instrução deve terminar com END IF e um ponto e vírgula, não apenas END
  3. você precisa alterar um delimitador com DELIMITER comando
  4. use EXISTS() em vez de COUNT()

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:
  1. criar tabela de preparo temporária sem restrições e sem índices
  2. use LOAD DATA INFILE para preencher a tabela de preparo
  3. ter tblspmaster e a tabela de preparo e usando INSERT ... SELECT sintaxe insira todas as duplicatas em tblspduplicate de uma só vez
  4. inserir apenas linhas inexistentes da tabela de preparo em tblspmaster novamente de uma só vez
  5. TRUNCATE ou DROP tabela de preparação