给定示例触发器:
CREATE TRIGGER example BEFORE UPDATE ON example_table FOR EACH ROW <DO STUFF>;
如果我正确理解触发器的 mysql 文档,那么会为受影响的每一行调用触发器。因此,如果我在 example_table
上运行更新查询哪个WHERE
子句匹配多行,然后多次调用触发器并且 <DO STUFF>
被执行多次。但是,如果我只想对表的每个更新查询执行一个操作(例如,基本操作日志记录),这是不方便的。
是否有触发器(等效项)允许我对表的每个查询执行一个操作?
一个清晰的例子:
想要的触发器:
CREATE TRIGGER example
BEFORE UPDATE
ON example_table
DO ONCE
INSERT INTO logging_table (time, table, action)
VALUES (timestamp(), 'example_table', 'UPDATE');
示例表:
id | name
---------------
1 | "George"
2 | "Gina"
3 | "Garfield"
查询涉及 example_table
中的多个元素:
UPDATE example_table WHERE id < 4 SET name = "NO ONE"
生成的日志记录表
time | table | action
------------------------------------------
20180215 114244 | example_table | UPDATE
请不要关注示例,而应关注示例的预期效果,因为示例是展示的简化。因此,允许示例工作但不能扩展为任何其他任意操作的 hack 不能回答我的问题。a
最佳答案
我认为您正在寻找语句级触发器。不幸的是,mysql 中没有语句级触发器。
检查这些:MySQL Trigger get current query that caused trigger to fire
https://dev.mysql.com/doc/refman/5.7/en/faqs-triggers.html#faq-mysql-have-trigger-levels :
“在 MySQL 5.7 中,所有触发器都是 FOR EACH ROW;也就是说,触发器会为插入、更新或删除的每一行激活。MySQL 5.7 不支持使用 FOR EACH STATEMENT 的触发器。”
关于mysql - 触发器仅对查询执行一次后台操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48805486/