您可能知道,没有任何语法可以修改 MySQL 触发器。
为此,您需要执行 DROP TRIGGER,然后使用新定义重新创建它。
什么是正确/最好的方法,考虑以下因素:
- 您不能将这两个语句封装在事务中,因为那将毫无意义(DROP TRIGGER 和 CREATE TRIGGER 都调用隐式事务)
- 您不能使用 LOCK TABLES READ,因为会触发错误
- 就在您的 DROP 和 CREATE TRIGGER 之间,一些其他 session 可能会插入/更新/删除行,您的新触发器和旧触发器都不会处理这些行。
最佳答案
在发布之前进行测试时,我忽略了我正在获取的 LOCK 类型,它是 READ。
所以看起来使用WRITE 锁可以完成这项工作:
delimiter $$
LOCK TABLES table1 WRITE $$
DROP TRIGGER IF EXISTS after_insert_on_table1 $$
CREATE TRIGGER after_insert_on_table1 AFTER INSERT ON table1
FOR EACH ROW
BEGIN
...
END
$$
UNLOCK TABLES $$
delimiter ;
因此我的建议是在更新/修改触发器时始终使用此序列。
关于mysql - 修改 MySQL 触发器的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28451395/