避免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中文网其他相关文章!

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

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

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

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

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

文章讨论了使用准备好的语句,输入验证和强密码策略确保针对SQL注入和蛮力攻击的MySQL。(159个字符)


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

WebStorm Mac版
好用的JavaScript开发工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能