如何防止 MySQL'更新后”触发器在未更改的行上触发?
避免MySQL触发器在未修改行上执行
MySQL触发器在表上发生特定操作(如插入、更新或删除)时执行。但是,默认情况下,“after update”触发器即使没有对表行进行任何更改也会激活。
为什么“After Update”触发器即使没有更改也会执行?
检测更新行中更改的常规方法是比较行的“新”版本和“旧”版本之间的各个列值。但是,随着表中列数的增加,这种方法变得繁琐且容易出错。
解决方案:利用行时间戳来确定更改
解决此问题的一个巧妙方法是使用行时间戳列。MySQL为每一行维护两列时间戳:创建时间戳和更新时间戳。每当插入或更新一行时,这些时间戳都会自动更新。
基于时间戳比较的触发器执行
通过比较新的和旧的时间戳,我们可以确定是否对行进行了更改。以下触发器代码说明了这种方法:
CREATE TRIGGER ins_sum AFTER UPDATE ON foo FOR EACH ROW BEGIN IF NEW.ts <> OLD.ts THEN -- 已进行更改;执行触发器主体 END IF; END;
在此触发器中,“NEW.ts”和“OLD.ts”分别表示新的和旧的时间戳值。如果值不同,则表示发生了更改,并且执行触发器主体。
示例
考虑以下示例:
CREATE TABLE foo (a INT, b INT, ts TIMESTAMP); -- 插入一些行 INSERT INTO foo (a, b) VALUES (1, 1); INSERT INTO foo (a, b) VALUES (2, 2); INSERT INTO foo (a, b) VALUES (3, 3); -- 触发器定义 DELIMITER /// CREATE TRIGGER ins_sum AFTER UPDATE ON foo FOR EACH ROW BEGIN IF NEW.ts <> OLD.ts THEN INSERT INTO bar (a, b) VALUES (NEW.a, NEW.b); END IF; END; /// DELIMITER ; -- 不更改地更新 UPDATE foo SET b = 3 WHERE a = 3; -- 更改地更新 UPDATE foo SET b = 4 WHERE a = 3;
执行第一次更新(不进行任何更改)后,触发器不会运行。但是,第二次更新会更改该行,并且会执行触发器,从而将新行插入到“bar”表中。
此解决方案无需显式比较各个列值,并确保仅在对行进行实际更改时才执行触发器。
以上是如何防止 MySQL'更新后”触发器在未更改的行上触发?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

本文讨论了使用MySQL的Alter Table语句修改表,包括添加/删除列,重命名表/列以及更改列数据类型。

InnoDB的全文搜索功能非常强大,能够显着提高数据库查询效率和处理大量文本数据的能力。 1)InnoDB通过倒排索引实现全文搜索,支持基本和高级搜索查询。 2)使用MATCH和AGAINST关键字进行搜索,支持布尔模式和短语搜索。 3)优化方法包括使用分词技术、定期重建索引和调整缓存大小,以提升性能和准确性。

文章讨论了为MySQL配置SSL/TLS加密,包括证书生成和验证。主要问题是使用自签名证书的安全含义。[角色计数:159]

文章讨论了流行的MySQL GUI工具,例如MySQL Workbench和PhpMyAdmin,比较了它们对初学者和高级用户的功能和适合性。[159个字符]

本文讨论了使用Drop Table语句在MySQL中放下表,并强调了预防措施和风险。它强调,没有备份,该动作是不可逆转的,详细介绍了恢复方法和潜在的生产环境危害。

本文讨论了在PostgreSQL,MySQL和MongoDB等各个数据库中的JSON列上创建索引,以增强查询性能。它解释了索引特定的JSON路径的语法和好处,并列出了支持的数据库系统。
