Per quanto riguarda il trigger ci sono diversi problemi:
- non hai
;
dopo l'inserimento dell'istruzione IF
l'istruzione dovrebbe terminare conEND IF
e un punto e virgola, non soloEND
- devi cambiare un delimitatore con
DELIMITER
comando - 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 INFILE
per popolare la tabella di staging - avere
tblspmaster
e la tabella di staging e utilizzandoINSERT ... SELECT
sintassi inserisci tutti i duplicati intblspduplicate
in una volta - inserire solo righe inesistenti dalla tabella di staging in
tblspmaster
di nuovo in una volta TRUNCATE
oDROP
tabella di stadiazione