sql >> Database teknologi >  >> RDS >> Mysql

før indsæt trigger for at indsætte duplikerede rækker i en anden tabel

Hvad angår din trigger, er der flere problemer:

  1. du har ikke ; efter indsæt erklæring
  2. IF sætningen skal slutte med END IF og et semikolon, ikke kun END
  3. du skal ændre et skilletegn med DELIMITER kommando
  4. brug EXISTS() i stedet for COUNT()

Når det er sagt, kan din trigger se ud

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 ;

Her er SQLFiddle demo

Brug IGNORE klausul i din LOAD DATA INFILE udmelding. MySql vil behandle fejl (overtræder unik begrænsning) som advarsler, der effektivt kasserer dubletter.

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

Bemærk: FYI mislykkede indsættelser for duplikerede rækker vil efterlade huller i værdierne for auto_increment SCN kolonne.

Du kan overveje en anden tilgang, som måske er mere at foretrække i forhold til ydeevnen:

  1. opret en midlertidig iscenesættelsestabel uden begrænsninger og ingen indekser
  2. brug LOAD DATA INFILE for at udfylde iscenesættelsestabellen
  3. har tblspmaster og iscenesættelsestabellen og ved at bruge INSERT ... SELECT syntaks indsæt alle dubletter i tblspduplicate på én gang
  4. indsæt kun ikke-eksisterende rækker fra iscenesættelsestabellen i tblspmaster igen på én gang
  5. TRUNCATE eller DROP iscenesættelsesbord



  1. Lukning af JDBC-forbindelser i pool

  2. OPDATERING med CASE og IN - Oracle

  3. Sådan fungerer SHOW COLLATION i MariaDB

  4. Adgang nægtet for MYSQL ERROR 1045