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

octopus_zy
  • 3
新手上路,请多包涵

现有一张表 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引擎,不存在事务回滚)

回复
阅读 1.1k
1 个回答
octopus_zy
  • 3
新手上路,请多包涵

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏