我有一个名为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登台表