Per quanto riguarda il trigger ci sono diversi problemi:
- non hai
;dopo l'inserimento dell'istruzione IFl'istruzione dovrebbe terminare conEND IFe un punto e virgola, non soloEND- devi cambiare un delimitatore con
DELIMITERcomando - usa
EXISTS()invece diCOUNT()
Detto questo, il tuo trigger potrebbe assomigliare a
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 ;
Ecco SQLFiddle demo
Usa IGNORE clausola nel tuo LOAD DATA INFILE dichiarazione. MySql tratterà gli errori (violazione del vincolo univoco) come avvisi che eliminano efficacemente i duplicati.
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: Cordiali saluti, gli inserimenti non riusciti per le righe duplicate lasceranno degli spazi vuoti nei valori di auto_increment SCN colonna.
Potresti prendere in considerazione un altro approccio che potrebbe essere più preferibile in termini di prestazioni:
- crea una tabella di staging temporanea senza vincoli e senza indici
- usa
LOAD DATA INFILEper popolare la tabella di staging - avere
tblspmastere la tabella di staging e utilizzandoINSERT ... SELECTsintassi inserisci tutti i duplicati intblspduplicatein una volta - inserire solo righe inesistenti dalla tabella di staging in
tblspmasterdi nuovo in una volta TRUNCATEoDROPtabella di stadiazione