En ce qui concerne votre déclencheur, il y a plusieurs problèmes :
- vous n'avez pas
;après insérer l'instruction IFl'instruction doit se terminer parEND IFet un point-virgule, pas seulementEND- vous devez changer un délimiteur avec
DELIMITERcommande - utiliser
EXISTS()plutôt queCOUNT()
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 :
- créer une table intermédiaire temporaire sans contraintes ni index
- utiliser
LOAD DATA INFILEpour remplir la table intermédiaire - avoir
tblspmasteret la table intermédiaire et en utilisantINSERT ... SELECTsyntaxe insérer tous les doublons danstblspduplicateen une seule fois - insérer uniquement les lignes inexistantes de la table intermédiaire dans
tblspmasterencore une fois TRUNCATEouDROPtable intermédiaire