我想在第一次满足条件时运行一次触发器。
要做到这一点,我想从触发器本身的内部放下触发器。我有两个问题: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;
编辑:还有第三个问题," FOR EACH ROW"意思?我只希望触发器运行一次,而不是每行一次。看看文档似乎" FOR EACH ROW"不是可选的。
答案 0 :(得分:0)
无法在触发器内执行DROP TRIGGER。
要解释原因,首先,DROP TRIGGER会导致隐式提交,其次,提交不会在触发器中发生。详情如下:
见(https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html):
本节中列出的语句(以及它们的任何同义词)隐式结束当前会话中活动的任何事务,就好像您在执行语句之前已完成COMMIT一样。
...
定义或修改数据库对象的数据定义语言(DDL)语句。更改事件,更改功能,更改程序,更改服务器,更改表,更改视图,创建数据库,创建事件,创建功能,创建索引,创建过程,创建角色,创建服务器,创建空间参考系统,创建表,创建触发器,创建视图,DROP DATABASE,DROP EVENT,DROP FUNCTION,DROP INDEX,DROP PROCEDURE,DROP ROLE,DROP SERVER,DROP SPATIAL REFERENCE SYSTEM,DROP TABLE, DROP TRIGGER ,DROP VIEW,INSTALL PLUGIN,RENAME TABLE ,TRUNCATE TABLE,UNINSTALL PLUGIN。
见(https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html):
触发器不能使用显式或隐式开始或结束事务的语句,例如START TRANSACTION, COMMIT 或ROLLBACK。 (允许ROLLBACK到SAVEPOINT,因为它不会结束事务。)。