我只想在第一次满足条件时运行一次触发器。
为了做到这一点,我想把触发器从触发器本身的内部放下。我有两个问题:1)有没有比这更好的方法;2)如果我把扳机扔到扳机体内,会不会有什么奇怪的事情发生?
这就是我目前所拥有的。对于上下文:有另一个进程正在运行移动要完成的任务,在特定情况下,它不会写入结果,因此在这种情况下,我希望运行一个脚本,这样当它们都完成时,我希望这个触发器读取另一个表中的一些值,然后删除触发器本身,这样它就不会每次正常完成任务时都运行。
CREATE TRIGGER some_trigger AFTER UPDATE ON table_name FOR EACH ROW
SELECT CASE WHEN ((SELECT count(*) FROM table_name WHERE status!='done') = 0)
THEN BEGIN
UPDATE table_name SET result = (SELECT other.result FROM table_name, other WHERE other.id = table_name.id);
DROP TRIGGER some_trigger;
END;
ELSE BEGIN END;
END CASE;
编辑:还有第三个问题,“每行”是什么意思?我只希望触发器运行一次,而不是每行一次。查看文档时,似乎“每行”不是可选的。
最佳答案
不能在触发器内执行丢弃触发器。
为了解释为什么,首先,DROP TRIGGER导致隐式提交,其次,提交不能在触发器中发生。详情如下:
DROP触发器导致隐式提交
见(https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html):
本节中列出的语句(以及它们的任何同义词)隐式地结束当前会话中活动的任何事务,就像在执行语句之前执行了提交一样。
...
定义或修改数据库对象的数据定义语言(DDL)语句。更改事件、更改函数、更改过程、更改服务器、更改表、更改视图、创建数据库、创建事件、创建函数、创建索引、创建过程、创建角色、创建服务器、创建空间引用系统、创建表、创建触发器、创建视图、删除数据库、删除事件、删除函数、删除索引、删除过程、删除角色,删除服务器,删除空间引用系统,删除表,删除触发器,删除视图,安装插件,重命名表,截断表,卸载插件。
提交不能在触发器中发生:
见(https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html):
触发器不能使用显式或隐式开始或结束事务的语句,例如START transaction、COMMIT或ROLLBACK。(允许回滚到保存点,因为它不会结束事务。)。
关于mysql - 从扳机体内放下扳机,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50843130/