Pokud jde o váš spouštěč, existuje několik problémů:
- nemáte
;
po příkazu vložení IF
příkaz by měl končitEND IF
a středník, nejenEND
- musíte změnit oddělovač pomocí
DELIMITER
pří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 INFILE
k naplnění pracovní tabulky - s
tblspmaster
a pracovní tabulky a pomocíINSERT ... SELECT
syntaxe vložte všechny duplikáty dotblspduplicate
jedním tahem - vložte do
tblspmaster
pouze neexistující řádky z pracovní tabulky opět jedním tahem TRUNCATE
neboDROP
inscenační stůl