sql >> Databasteknik >  >> RDS >> Mysql

innan infoga utlösare för att infoga dubbletter av rader i en annan tabell

När det gäller utlösaren finns det flera problem:

  1. du har inte ; efter infoga uttalande
  2. IF uttalandet ska sluta med END IF och ett semikolon, inte bara END
  3. du måste ändra en avgränsare med DELIMITER kommando
  4. använd EXISTS() istället för COUNT()

Med det sagt kan din trigger se ut

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 ;

Här är SQLFiddle demo

Använd IGNORE sats i din LOAD DATA INFILE påstående. MySql kommer att behandla fel (som bryter mot unika begränsningar) som varningar som effektivt kasserar dubbletter.

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

Obs! FYI misslyckade infogningar för dubbletter av rader kommer att lämna luckor i värdena för auto_increment SCN kolumn.

Du kan överväga ett annat tillvägagångssätt som kan vara mer att föredra prestandamässigt:

  1. skapa en temporär mellanställningstabell utan begränsningar och inga index
  2. använd LOAD DATA INFILE för att fylla i mellantabell
  3. har tblspmaster och mellanställningstabellen och med INSERT ... SELECT syntax infoga alla dubbletter i tblspduplicate i ett svep
  4. infoga endast obefintliga rader från staging-tabellen i tblspmaster igen i ett svep
  5. TRUNCATE eller DROP mellanställningsbord



  1. Hur man ökar maximala anslutningar i PostgreSQL

  2. Odoo-installation på Mac kunde inte köra kommandot LESSC

  3. MySQL hur fyller man i saknade datum inom intervallet?

  4. SYSDATETIME() Exempel i SQL Server (T-SQL)