触发器仅对查询执行一次后台操作
trigger performing background action only once for a query
给出示例触发器:
CREATE TRIGGER example BEFORE UPDATE ON example_table FOR EACH ROW <DO STUFF>;
如果我正确理解了触发器的 mysql 文档,那么会为受影响的每一行调用触发器。因此,如果我 运行 对 example_table
的更新查询 which WHERE
子句匹配多行,那么触发器将被调用多次并且 <DO STUFF>
将被执行多次。但是,如果我只想在 table 上对每个更新查询执行一个操作(例如基本操作日志记录),这是不方便的。
是否有触发器(等效项)允许我对 table 的每个查询执行一个操作?
一个澄清的例子:
想要的触发器:
CREATE TRIGGER example
BEFORE UPDATE
ON example_table
DO ONCE
INSERT INTO logging_table (time, table, action)
VALUES (timestamp(), 'example_table', 'UPDATE');
example_table:
id | name
---------------
1 | "George"
2 | "Gina"
3 | "Garfield"
查询涉及 example_table
中的多个元素:
UPDATE example_table WHERE id < 4 SET name = "NO ONE"
生成的日志记录table
time | table | action
------------------------------------------
20180215 114244 | example_table | UPDATE
请不要把重点放在示例上,而是示例的预期效果,因为示例是为了展示而进行的简化。因此,允许示例工作但不能扩展为任何其他任意操作的黑客不回答我的 question.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 :
"In MySQL 5.7, all triggers are FOR EACH ROW; that is, the trigger is activated for each row that is inserted, updated, or deleted. MySQL 5.7 does not support triggers using FOR EACH STATEMENT."
给出示例触发器:
CREATE TRIGGER example BEFORE UPDATE ON example_table FOR EACH ROW <DO STUFF>;
如果我正确理解了触发器的 mysql 文档,那么会为受影响的每一行调用触发器。因此,如果我 运行 对 example_table
的更新查询 which WHERE
子句匹配多行,那么触发器将被调用多次并且 <DO STUFF>
将被执行多次。但是,如果我只想在 table 上对每个更新查询执行一个操作(例如基本操作日志记录),这是不方便的。
是否有触发器(等效项)允许我对 table 的每个查询执行一个操作?
一个澄清的例子:
想要的触发器:
CREATE TRIGGER example
BEFORE UPDATE
ON example_table
DO ONCE
INSERT INTO logging_table (time, table, action)
VALUES (timestamp(), 'example_table', 'UPDATE');
example_table:
id | name
---------------
1 | "George"
2 | "Gina"
3 | "Garfield"
查询涉及 example_table
中的多个元素:
UPDATE example_table WHERE id < 4 SET name = "NO ONE"
生成的日志记录table
time | table | action
------------------------------------------
20180215 114244 | example_table | UPDATE
请不要把重点放在示例上,而是示例的预期效果,因为示例是为了展示而进行的简化。因此,允许示例工作但不能扩展为任何其他任意操作的黑客不回答我的 question.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 :
"In MySQL 5.7, all triggers are FOR EACH ROW; that is, the trigger is activated for each row that is inserted, updated, or deleted. MySQL 5.7 does not support triggers using FOR EACH STATEMENT."