sql >> Databáze >  >> RDS >> Mysql

před insert trigger pro vložení duplicitních řádků do jiné tabulky

Pokud jde o váš spouštěč, existuje několik problémů:

  1. nemáte ; po příkazu vložení
  2. IF příkaz by měl končit END IF a středník, nejen END
  3. musíte změnit oddělovač pomocí DELIMITER příkaz
  4. 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ší:

  1. vytvořit dočasnou pracovní tabulku bez omezení a bez indexů
  2. použijte LOAD DATA INFILE k naplnění pracovní tabulky
  3. s tblspmaster a pracovní tabulky a pomocí INSERT ... SELECT syntaxe vložte všechny duplikáty do tblspduplicate jedním tahem
  4. vložte do tblspmaster pouze neexistující řádky z pracovní tabulky opět jedním tahem
  5. TRUNCATE nebo DROP inscenační stůl



  1. Co je kandidátský klíč v návrhu databáze?

  2. PHP $stmt->num_rows nefunguje podle připravených příkazů

  3. Jak opravit adresu URL poskytovatele obsahu, která nebyla nalezena v poskytovateli obsahu pro Android?

  4. Mysql naformátujte řetězec jako XXXXXXXXXXXX až XX-XX-XXXXXXX-X