作为一种解决方法,您可以使用时间戳(旧的和新的)进行检查,因为当行没有更改时,该时间戳不会更新。 (可能这是混淆的源泉?因为该时间戳也被称为“on update”,但在没有更改发生时不会执行。)
一秒钟内的更改将不会执行触发器的该部分,但在某些情况下,这可能是可以接受的(比如当您有一个拒绝快速更改的应用程序时)。
例如,而不是
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 foo SET b = 3 WHERE a = 3;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
select * from foo WHERE a = 3;
+
| a | b | ts |
+
| 3 | 3 | 2011-06-14 09:29:46 |
+
1 rows in set (0.00 sec)
select * from bar;
Empty set (0.00 sec)
UPDATE foo SET b = 4 WHERE a=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
select * 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)
select * 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 |
+
INSERT INTO bar VALUES(NEW.a, NEW.b);
进行插入。是否有任何解决方法可以避免这种情况?类似INSERT INTO bar VALUES(SELECT * FROM foo WHERE…);
这样的语句是否可行? - zxcatINSERT INTO bar, SELECT * FROM foo WHERE foo.id = OLD.id
,这样就可以了。 - Ifedi OkonkwoWHEN NEW.* IS DISTINCT FROM OLD.*
条件,所以 MySQL 应该实现类似的东西... - Andy