【发布时间】:2011-09-11 21:13:24
【问题描述】:
是否有可能仅在数据已真正更改的情况下使用“更新后”触发器。 我知道“新旧”。但是当使用它们时,我只能比较列。 例如“NEW.count OLD.count”。
但我想要类似的东西:运行触发器 if "NEW OLD"
一个例子:
create table foo (a INT, b INT);
create table bar (a INT, b INT);
INSERT INTO foo VALUES(1,1);
INSERT INTO foo VALUES(2,2);
INSERT INTO foo VALUES(3,3);
CREATE TRIGGER ins_sum
AFTER UPDATE ON foo
FOR EACH ROW
INSERT INTO bar VALUES(NEW.a, NEW.b);
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 bar;
+------+------+
| a | b |
+------+------+
| 3 | 3 |
+------+------+
关键是,有更新,但没有任何变化。 但是触发器还是跑了。恕我直言,应该有一种方法不会。
我知道我可以使用
如果现在.b 旧.b
对于这个例子。
但是想象一个包含不断变化的列的大表。 您必须比较每一列,如果数据库发生更改,您必须调整触发器。 并且比较硬编码的行的每一列并不“感觉”好:)
加法
正如你在网上看到的那样
匹配行:1 更改:0 警告:0
MySQL 知道该行没有改变。但它不与触发器共享此知识。 像“AFTER REAL UPDATE”之类的触发器或类似的东西会很酷。
【问题讨论】:
-
如果列发生变化,无论如何您都需要调整触发器,因为它会插入
INSERT INTO bar VALUES(NEW.a, NEW.b);。有什么办法可以避免吗?像INSERT INTO bar VALUES(SELECT * FROM foo WHERE…);这样的东西会起作用吗? -
@juwens,这个问题你应该得到 10+。令人难以置信的是,他们怎么能如此反直觉地建立这种行为!
-
@zcat,不,您不一定需要在每次表更改时调整触发器。你可以做
INSERT INTO bar, SELECT * FROM foo WHERE foo.id = OLD.id,没问题。 -
附带说明一下,Postgres 的行为也是如此,但您可以在创建触发器语句中添加
WHEN NEW.* IS DISTINCT FROM OLD.*条件,因此 MySQL 应该实现类似的东西...
标签: mysql sql database triggers