sql >> Database >  >> RDS >> Mysql

voor invoegen trigger voor het invoegen van dubbele rijen in een andere tabel

Wat betreft je trigger zijn er verschillende problemen:

  1. je hebt geen ; na invoegopdracht
  2. IF statement moet eindigen op END IF en een puntkomma, niet alleen END
  3. je moet een scheidingsteken wijzigen met DELIMITER commando
  4. gebruik EXISTS() in plaats van COUNT()

Dat gezegd hebbende, zou je trigger eruit kunnen zien als

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 is SQLFiddle demo

Gebruik IGNORE clausule in uw LOAD DATA INFILE uitspraak. MySql behandelt fouten (die de unieke beperking schenden) als waarschuwingen die duplicaten effectief weggooien.

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

Opmerking: Ter info:mislukte invoegingen voor dubbele rijen laten gaten achter in de waarden van auto_increment SCN kolom.

U kunt een andere benadering overwegen die qua prestaties wellicht beter is:

  1. maak een tijdelijke staging-tabel zonder beperkingen en zonder indexen
  2. gebruik LOAD DATA INFILE om de verzameltabel te vullen
  3. met tblspmaster en de staging-tabel en met behulp van INSERT ... SELECT syntaxis plaats alle duplicaten in tblspduplicate in één keer
  4. voeg alleen niet-bestaande rijen uit de staging-tabel in tblspmaster in weer in één keer
  5. TRUNCATE of DROP verzameltafel



  1. OASIS-SVN en git gebruiken voor toegang tot broncodecontrole

  2. Voeg Prefix toe aan auto-increment in mysql db

  3. IndexOf-functie in T-SQL

  4. Parameter gebruiken als kolomnaam in Postgres-functie