mysql批量插入时,若有一条报错,则上一条的触发器不执行?
现有一张表 frm_72 和一张记录自增id的表 cmpp_frm;
frm_72 上写了触发器如下:
BEGIN
declare testid int;
update cmpp_frm set auto_id = auto_id + 1 where id=72;
select auto_id into @testid from cmpp_frm where id=72;
set new.id = @testid;
END
作用是当 frm_72 有新数据插入时,让cmpp_frm 的auto_id字段+1,并获得值做id。
单条插入时执行正常。批量插入2条时(设语句1正常,语句2报错),若 auto_id 初始是1, 正常应该 语句1 的id 是2,auto_id 字段是2,语句2报错,auto_id不变。
但是,运行结果是 auto_id 仍是 1,语句1 的id 是2,语句2报错。
不知道为什么触发器中的 update 没有执行,但 select 却得到了自增后的结果?
最终的后果是再插入正常的语句,auto_id+1后仍是2,造成了主键重复报错。
(由于业务原因用了myisam引擎,不存在事务回滚)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
问题找到了,cmpp_frm是innodb引擎,所以它回滚了,而 frm_72 是marge引擎(myisam)不支持回滚。并且这样记录id在并发情况下修改会造成行锁,影响效率,已采用其他办法。