Mysql
 sql >> база данни >  >> RDS >> Mysql

преди вмъкване на тригер за вмъкване на дублиращи се редове в друга таблица

Що се отнася до задействането, има няколко проблема:

  1. нямате ; след изявление за вмъкване
  2. IF операторът трябва да завършва с END IF и точка и запетая, а не само END
  3. трябва да промените разделител с DELIMITER команда
  4. използвайте EXISTS() вместо COUNT()

Като се има предвид това, спусъкът ви може да изглежда като

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 ;

Ето SQLPiddle демонстрация

Използвайте IGNORE клауза във вашия LOAD DATA INFILE изявление. MySql ще третира грешките (нарушаващи уникалното ограничение) като предупреждения, ефективно изхвърляйки дубликати.

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

Забележка: FYI неуспешните вмъквания за дублиращи се редове ще оставят празнини в стойностите на auto_increment SCN колона.

Може да помислите за друг подход, който може да е по-предпочитан по отношение на производителността:

  1. създайте временна промежуточна таблица без ограничения и без индекси
  2. използвайте LOAD DATA INFILE за попълване на таблицата за етапи
  3. има tblspmaster и стадийната таблица и с помощта на INSERT ... SELECT синтаксис вмъкване на всички дубликати в tblspduplicate наведнъж
  4. вмъкнете само несъществуващи редове от таблицата на етапа в tblspmaster отново наведнъж
  5. TRUNCATE или DROP постановка таблица



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. операцията изтриване заключва цялата таблица в innodb

  2. MySQL - mysqldump --routines за експортиране само на 1 съхранена процедура (по име), а не на всяка рутина

  3. Как да промените порта по подразбиране на mysql от 3306 на 3360

  4. вмъкнете множество полета с помощта на цикъл foreach

  5. MySQL Event Scheduler в определено време всеки ден