栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

仅当行已更改时,MySQL才会在更新后触发

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

仅当行已更改时,MySQL才会在更新后触发

作为一种解决方法,您可以使用时间戳(旧的和新的)来检查,如果该行没有更改,则 不会
更新该时间戳。(可能是造成混乱的根源?因为那也被称为“更新时”,但是在没有任何变化的情况下不会执行)一秒钟之内的变化将不会执行触发器的那部分,但是在某些情况下可能会很好(例如,当您的应用程序仍然拒绝快速更改时。)

例如,而不是

IF NEW.a <> OLD.a or NEW.b <> OLD.b  THEN    INSERT INTO bar (a, b) VALUES(NEW.a, NEW.b) ;END IF

你可以用

IF NEW.ts <> OLD.ts THEN    INSERT INTO bar (a, b) VALUES(NEW.a, NEW.b) ;END IF

这样,您就不必在每次更新方案时都更改触发器(问题中提到的问题)。

编辑:添加了完整的示例

create table foo (a INT, b INT, ts TIMESTAMP);create table bar (a INT, b INT);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 ;select * from foo;+------+------+---------------------+| a    | b    | ts       |+------+------+---------------------+|    1 |    1 | 2011-06-14 09:29:46 ||    2 |    2 | 2011-06-14 09:29:46 ||    3 |    3 | 2011-06-14 09:29:46 |+------+------+---------------------+3 rows in set (0.00 sec)-- UPDATe without changeUPDATE foo SET b = 3 WHERe a = 3;Query OK, 0 rows affected (0.00 sec)Rows matched: 1  Changed: 0  Warnings: 0-- the timestamo didnt changeselect * from foo WHERe a = 3;+------+------+---------------------+| a    | b    | ts       |+------+------+---------------------+|    3 |    3 | 2011-06-14 09:29:46 |+------+------+---------------------+1 rows in set (0.00 sec)-- the trigger didn't runselect * from bar;Empty set (0.00 sec)-- UPDATe with changeUPDATE foo SET b = 4 WHERe a=3;Query OK, 1 row affected (0.00 sec)Rows matched: 1  Changed: 1  Warnings: 0-- the timestamp changedselect * from foo;+------+------+---------------------+| a    | b    | ts       |+------+------+---------------------+|    1 |    1 | 2011-06-14 09:29:46 ||    2 |    2 | 2011-06-14 09:29:46 ||    3 |    4 | 2011-06-14 09:34:59 |+------+------+---------------------+3 rows in set (0.00 sec)-- and the trigger ranselect * from bar;+------+------+---------------------+| a    | b    | ts       |+------+------+---------------------+|    3 |    4 | 2011-06-14 09:34:59 |+------+------+---------------------+1 row in set (0.00 sec)

由于mysql在处理时间戳方面的行为,因此可以正常工作。仅当更新中发生更改时,时间戳才会更新。

文档在这里:https :
//dev.mysql.com/doc/refman/5.7/en/timestamp-
initialization.html

desc foo;+-------+-----------+------+-----+-------------------+-----------------------------+| Field | Type      | Null | Key | Default| Extra |+-------+-----------+------+-----+-------------------+-----------------------------+| a     | int(11)   | YES  |     | NULL   |       || b     | int(11)   | YES  |     | NULL   |       || ts    | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |+-------+-----------+------+-----+-------------------+-----------------------------+


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/402698.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号