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

prima di inserire il trigger per inserire righe duplicate in un'altra tabella

Per quanto riguarda il trigger ci sono diversi problemi:

  1. non hai ; dopo l'inserimento dell'istruzione
  2. IF l'istruzione dovrebbe terminare con END IF e un punto e virgola, non solo END
  3. devi cambiare un delimitatore con DELIMITER comando
  4. usa EXISTS() invece di COUNT()

Detto questo, il tuo trigger potrebbe assomigliare a

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 ;

Ecco SQLFiddle demo

Usa IGNORE clausola nel tuo LOAD DATA INFILE dichiarazione. MySql tratterà gli errori (violazione del vincolo univoco) come avvisi che eliminano efficacemente i duplicati.

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

Nota: Cordiali saluti, gli inserimenti non riusciti per le righe duplicate lasceranno degli spazi vuoti nei valori di auto_increment SCN colonna.

Potresti prendere in considerazione un altro approccio che potrebbe essere più preferibile in termini di prestazioni:

  1. crea una tabella di staging temporanea senza vincoli e senza indici
  2. usa LOAD DATA INFILE per popolare la tabella di staging
  3. avere tblspmaster e la tabella di staging e utilizzando INSERT ... SELECT sintassi inserisci tutti i duplicati in tblspduplicate in una volta
  4. inserire solo righe inesistenti dalla tabella di staging in tblspmaster di nuovo in una volta
  5. TRUNCATE o DROP tabella di stadiazione