mysql - 触发器仅对查询执行一次后台操作

标签 mysql sql database-trigger

给定示例触发器:

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/

相关文章:

java - 触发 TTL 删除 Cassandra

mysql - 将表格行转置为列

mysql - 内存中 SQL/NoSQL - 保持查询能力 - 可能使用 MySQL 或 SQL Server

php - 在 PHP 中比较一个查询和多个结果

sql - Postgresql 根据值更新特定字段(触发器)

MySQL before insert 触发器,删除 insert if 条件

mysql - 创建查询 SELECT,然后从找到的结果中插入

mysql - 如何在 WHERE IN 子句中使用字符串函数结果

用于显示电子邮件列中域名总数的 SQL

sql - Microsoft SQL Server (MSSQL) 可更新 View ,具有多个基表和完整性能