MySQL触发器问题
发布于 10 年前 作者 DevinXian 5338 次浏览 最后一次编辑是 8 年前 来自 问答

可能问的不是地方,不过我觉得我大CNode,应该可以原谅占地行为… 有个诡异的触发器需求:某表插入一条记录,检测该记录,如果不满足条件,则在触发器中终止此次插入;否则,修改相关列,插入。目前使用的是before insert是来实现,但是不满足条件时,如何终止? 查了一些资料,说如果不满足条件时,则让MySQL抛出一个异常(故意查不存在的表啦,让主键冲突啦…),则本地插入终止。有其他可行方案?

8 回复

你这个需求必须用数据库来做 不能用程序实现? mysql本身触发器是没有终止语句的功能的 说实话触发器中不应该有过多的逻辑 触发器最好是执行一个 固定的指令 就像你说的 目前只能利用一个错误的语句 终止运行 或者改用自定义函数或存储过程来实现

@gloomyzerg 一般这种lz这种场景我的第一反应是用程序做,先查询一次,再决定是否插入。。

这个貌似不难做到吧,把插入和查询写在一个事务里面,当查询不满足条件,rollback一下应该就可以了。实在不行就自己写个存储过程,让程序去调用

@alsotang 你这样会有一个问题,多进程,多连接时, 1、A进程第一次查询可以插入条件; 2、B进程随后也过来一次查询,也是可以插入; 3、A进程决定插入 4、B进程也决定插入,楼主这样的需求肯定没有做唯一性约束,数据可能就乱了 其实我觉得楼主这样的需求,可能表设计,约束条件设定都有问题

@alsotang 问题是程序连源码都木有,用的是第三方,而且还不太了解;领导说用触发器…我就被trigger了…

@DoubleSpout 也是。。会存在一致性问题

@gloomyzerg @alsotang @DoubleSpout 在得知该系统有webhook后,果断转变思路,写更新逻辑来纠正这个错误。感谢大伙的回复~

@DoubleSpout 这样的话,后一个插入不是会报错吗。这样就插不进去了。处理一下异常就可以了吧?至少一致性是保持了

回到顶部