En ce qui concerne votre déclencheur, il y a plusieurs problèmes :
- vous n'avez pas
;
après insérer l'instruction IF
l'instruction doit se terminer parEND IF
et un point-virgule, pas seulementEND
- vous devez changer un délimiteur avec
DELIMITER
commande - 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 INFILE
pour remplir la table intermédiaire - avoir
tblspmaster
et la table intermédiaire et en utilisantINSERT ... SELECT
syntaxe insérer tous les doublons danstblspduplicate
en une seule fois - insérer uniquement les lignes inexistantes de la table intermédiaire dans
tblspmaster
encore une fois TRUNCATE
ouDROP
table intermédiaire