我有一张桌子叫tblspmaster
其中 sp 列我有唯一索引,因此不会插入重复项,但我想将重复行插入到tblspduplicate
。所以我决定为此编写触发器。 IN 主表是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
****************
就您而言,触发器存在以下几个问题:
- 你没有
;
插入语句后
-
IF
声明应以END IF
和一个分号,不仅仅是END
- 你必须改变分隔符
DELIMITER
command
- use
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 ;
Here is SQLFiddle demo
Use IGNORE
你的条款LOAD DATA INFILE
陈述。 MySql 会将错误(违反唯一约束)视为警告,从而有效地丢弃重复项。
加载数据文件
如果指定 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
Note:仅供参考,重复行的插入失败将在 auto_increment 的值中留下间隙SCN
column.
您可以考虑另一种可能在性能方面更可取的方法:
- 创建没有约束和索引的临时临时表
- use
LOAD DATA INFILE
填充暂存表
- having
tblspmaster
和暂存表并使用INSERT ... SELECT
语法插入所有重复项tblspduplicate
一气呵成
- 仅将临时表中不存在的行插入
tblspmaster
一口气再次
-
TRUNCATE
or DROP
暂存表
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)