sql >> Base de Datos >  >> RDS >> Mysql

antes de insertar el activador para insertar filas duplicadas en otra tabla

En lo que respecta a los disparadores, hay varios problemas:

  1. no tienes ; después de insertar declaración
  2. IF declaración debe terminar con END IF y un punto y coma, no solo END
  3. tienes que cambiar un delimitador con DELIMITER comando
  4. usa EXISTS() en lugar de COUNT()

Dicho esto, su gatillo podría verse como

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 ;

Aquí está SQLFiddle demostración

Usa IGNORE cláusula en su LOAD DATA INFILE declaración. MySql tratará los errores (que violen la restricción única) como advertencias y descartará efectivamente los duplicados.

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

Nota: Para su información, las inserciones fallidas para filas duplicadas dejarán espacios en los valores de auto_increment SCN columna.

Puede considerar otro enfoque que podría ser más preferible en cuanto a rendimiento:

  1. crear una tabla provisional temporal sin restricciones ni índices
  2. use LOAD DATA INFILE para llenar la tabla de preparación
  3. tener tblspmaster y la tabla de etapas y usando INSERT ... SELECT sintaxis insertar todos los duplicados en tblspduplicate de una vez
  4. insertar solo filas inexistentes de la tabla de preparación en tblspmaster de nuevo de una vez
  5. TRUNCATE o DROP mesa de escenario