我有一个名为tblspmaster
的表,其中sp列i具有唯一索引,因此不会插入重复项,但我想将重复的行插入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
我有问题列表
这种方法是否可以阻止重复并插入另一个副本 表?
我的触发器没有执行,因为它显示了一些语法错误
错误回复是Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END END' at line 7
的 的 ** * ** * ** * 的** * **** EDITED 的 * ** * ** < em> * ** * ****
这里是主表和重复表以及触发器和加载数据文件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
语句,因为没有标题行。
答案 0 :(得分:7)
就你引发的问题而言,有几个问题:
;
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 演示
在IGNORE
语句中使用LOAD DATA INFILE
子句。 MySql会将错误(违反唯一约束)视为警告,有效地丢弃重复项。
<强> LOAD DATA INFILE 强>
如果指定IGNORE,则会跳过复制唯一键值上现有行的输入行。
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
临时表