mysql-在插入触发器之前,用于将重复的行插入到另一个表中

我有一个名为tblspmaster的表,其中sp列具有唯一索引,因此不会插入任何重复项,但是我想将重复的行插入tblspduplicate中.所以我决定为此写触发器.在主表是tblspmaster记录将用mysql的加载文件插入

create trigger tblspmaster_noduplicate
before insert on tblspmaster
for each row
begin
  if ( select count(sp) from tblspmaster where sp=new.sp > 0 )then
    insert into tblspduplicate (sp,FileImported,AMZFileName)   values (NEW.sp,NEW.FileImported,NEW.AMZFileName)
  END
END

我有一个问题清单

>这种正确的方法可以停止重复并插入另一个
桌子?
>我的触发器未执行,因为它显示了一些语法错误

错误响应是错误代码:1064.检查与您的MySQL服务器版本相对应的手册,以获取在第7行的“ END END”附近使用的正确语法

**************** EDITED **************

这是主表和重复表以及触发器和加载数据文件MySQL语句的表定义

CREATE TABLE IF NOT EXISTS `tblspmaster` (
  `CSN` bigint(20) NOT NULL AUTO_INCREMENT,
  `SP` varchar(10) NOT NULL,
  `FileImportedDate` date NOT NULL,
  `AMZFileName` varchar(50) NOT NULL,
  `CasperBatch` varchar(50) NOT NULL,
  `BatchProcessedDate` date NOT NULL,
  `ExpiryDate` date NOT NULL,
  `Region` varchar(50) NOT NULL,
  `FCCity` varchar(50) NOT NULL,
  `VendorID` int(11) NOT NULL,
  `LocationID` int(11) NOT NULL,
  PRIMARY KEY (`CSN`),
  UNIQUE KEY `SP` (`SP`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10000000000 ;




   CREATE TABLE IF NOT EXISTS `tblspduplicate` (
      `SP` varchar(50) NOT NULL,
      `FileImportedDate` date NOT NULL,
      `AMZFileName` varchar(50) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

use casper;
DELIMITER $$
create trigger tblspmaster_noduplicate
before insert on tblspmaster
for each row
begin
  if ( select count(sp) from tblspmaster where sp=new.sp > 0 ) then
    insert into tblspduplicate (sp,FileImportedDate,AMZFileName)   values (NEW.sp,NEW.FileImportedDate,NEW.AMZFileName);
  END IF;
END$$

DELIMITER ;






LOAD DATA local INFILE 'E://31october//SP//sp_files_sample1//400k sp00 6-19 E.csv'
INTO TABLE  tblspmaster
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(sp);

这是我从c#控制台应用程序执行此MySql命令的故事的一个转折,但我认为它不会以任何方式影响与数据库相关的结构或程序.
我还需要删除IGNORE 1 LINES语句,因为将没有标题行.

解决方法:

就触发问题而言,存在几个问题:

>你没有;在插入语句之后
> IF语句应以END IF和分号结尾,而不仅仅是END
>您必须使用DELIMITER命令更改定界符
>使用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 ;

这是SQLFiddle演示

在LOAD DATA INFILE语句中使用IGNORE子句. MySql将错误(违反唯一约束)作为警告有效地丢弃重复项.

07001
If you specify IGNORE, input rows that duplicate an existing row on a unique key value are skipped.

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列的值中留下空白.

您可以考虑另一种可能更可取的性能方法:

>创建没有限制和索引的临时登台表
>使用LOAD DATA INFILE填充登台表
>具有tblspmaster和登台表并使用INSERT … SELECT语法,一次性将所有重复项插入tblspduplicate
>一次性将临时表中仅不存在的行再次插入到tblspmaster中
> TRUNCATE或DROP登台表

上一篇:javascript-在.trigger内部使用时,冒号在jQuery中是什么意思?


下一篇:phpmyadmin mysql触发语法错误