Pokud jde o váš spouštěč, existuje několik problémů:
- nemáte
;po příkazu vložení IFpříkaz by měl končitEND IFa středník, nejenEND- musíte změnit oddělovač pomocí
DELIMITERpříkaz - použijte
EXISTS()spíše nežCOUNT()
Vaše spoušť by mohla vypadat takto
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 ;
Zde je SQLFiddle demo
Použijte IGNORE klauzule ve vašem LOAD DATA INFILE prohlášení. MySql bude chyby (porušující jedinečné omezení) považovat za varování, která účinně zahazují duplikáty.
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
Poznámka: Pro informaci, neúspěšné vložení duplicitních řádků zanechá mezery v hodnotách auto_increment SCN sloupec.
Můžete zvážit jiný přístup, který by mohl být z hlediska výkonu výhodnější:
- vytvořit dočasnou pracovní tabulku bez omezení a bez indexů
- použijte
LOAD DATA INFILEk naplnění pracovní tabulky - s
tblspmastera pracovní tabulky a pomocíINSERT ... SELECTsyntaxe vložte všechny duplikáty dotblspduplicatejedním tahem - vložte do
tblspmasterpouze neexistující řádky z pracovní tabulky opět jedním tahem TRUNCATEneboDROPinscenační stůl