mysql批量插入时,若有一条报错,则上一条的触发器不执行?

发布于 2022-09-11 22:56:15 字数 601 浏览 27 评论 0

现有一张表 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

玻璃人 2022-09-18 22:56:15

问题找到了,cmpp_frm是innodb引擎,所以它回滚了,而 frm_72 是marge引擎(myisam)不支持回滚。并且这样记录id在并发情况下修改会造成行锁,影响效率,已采用其他办法。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文