Mysql
 sql >> Base de données >  >> RDS >> Mysql

avant le déclencheur d'insertion pour insérer des lignes en double dans une autre table

En ce qui concerne votre déclencheur, il y a plusieurs problèmes :

  1. vous n'avez pas ; après insérer l'instruction
  2. IF l'instruction doit se terminer par END IF et un point-virgule, pas seulement END
  3. vous devez changer un délimiteur avec DELIMITER commande
  4. utiliser EXISTS() plutôt que COUNT()

Cela étant dit, votre déclencheur pourrait ressembler à

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 ;

Voici SQLFiddle démo

Utilisez IGNORE clause dans votre LOAD DATA INFILE déclaration. MySql traitera les erreurs (violation de la contrainte unique) comme des avertissements supprimant efficacement les doublons.

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

Remarque : Pour votre information, les insertions échouées pour les lignes en double laisseront des écarts dans les valeurs de auto_increment SCN colonne.

Vous pouvez envisager une autre approche qui pourrait être préférable en termes de performances :

  1. créer une table intermédiaire temporaire sans contraintes ni index
  2. utiliser LOAD DATA INFILE pour remplir la table intermédiaire
  3. avoir tblspmaster et la table intermédiaire et en utilisant INSERT ... SELECT syntaxe insérer tous les doublons dans tblspduplicate en une seule fois
  4. insérer uniquement les lignes inexistantes de la table intermédiaire dans tblspmaster encore une fois
  5. TRUNCATE ou DROP table intermédiaire