Mysql
 sql >> Datenbank >  >> RDS >> Mysql

vor dem Insert-Trigger zum Einfügen doppelter Zeilen in eine andere Tabelle

In Bezug auf Ihren Trigger gibt es mehrere Probleme:

  1. Sie haben ; nicht nach der Insert-Anweisung
  2. IF sollte mit END IF enden und ein Semikolon, nicht nur END
  3. Sie müssen ein Trennzeichen mit DELIMITER ändern Befehl
  4. benutze EXISTS() statt COUNT()

Davon abgesehen könnte Ihr Trigger so aussehen

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 ;

Hier ist SQLFiddle Demo

Verwenden Sie IGNORE -Klausel in Ihrem LOAD DATA INFILE Erklärung. MySql behandelt Fehler (die die Eindeutigkeitsbeschränkung verletzen) als Warnungen und verwirft effektiv Duplikate.

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

Hinweis: Zu Ihrer Information, fehlgeschlagene Einfügungen für doppelte Zeilen hinterlassen Lücken in den Werten von auto_increment SCN Spalte.

Sie können einen anderen Ansatz in Betracht ziehen, der in Bezug auf die Leistung möglicherweise vorzuziehen ist:

  1. temporäre Staging-Tabelle ohne Einschränkungen und ohne Indizes erstellen
  2. benutze LOAD DATA INFILE Staging-Tabelle zu füllen
  3. mit tblspmaster und der Staging-Tabelle und mit INSERT ... SELECT Syntax alle Duplikate in tblspduplicate einfügen auf einmal
  4. Füge nur nicht vorhandene Zeilen aus der Staging-Tabelle in tblspmaster ein wieder in einem Zug
  5. TRUNCATE oder DROP Staging-Tabelle