MySQL僅在行已更改時才更新是否有可能僅在數據被真正改變的情況下使用“更新后”觸發器。我知道“新舊”。但是在使用它們時我只能比較列。例如“NEW.count <> OLD.count”。但我想要的是:如果“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: 0select * from bar;+------+------+| a | b |+------+------+| 3 | 3 |+------+------+關鍵是,有一個更新,但沒有任何改變。但無論如何都觸發了觸發器。恕我直言應該有一種方式它沒有。我知道我可以使用如果NOW.b <> OLD.b對于這個例子。想象一下有一個變化列的大桌子。您必須比較每一列,如果數據庫發生更改,則必須調整觸發器。并且比較硬編碼的行的每一列并不“感覺”好:)加成正如你所看到的那樣匹配的行數:1已更改:0警告:0MySQL知道該行沒有改變。但它不會與觸發器分享這些知識。像“AFTER REAL UPDATE”之類的觸發器或類似的東西會很酷。
3 回答

慕萊塢森
TA貢獻1810條經驗 獲得超4個贊
想象一下有一個變化列的大桌子。您必須比較每一列,如果數據庫發生更改,則必須調整觸發器。并且比較每行硬編碼并不“感覺”好:)
是的,但這是繼續進行的方式。
作為旁注,在更新之前進行先發制人檢查也是一種好習慣:
UPDATE foo SET b = 3 WHERE a=3 and b <> 3;
在您的示例中,這將使它更新(并因此覆蓋)兩行而不是三行。

蕪湖不蕪
TA貢獻1796條經驗 獲得超7個贊
我不能發表評論,所以請注意,如果你的列支持NULL值,OLD.x <> NEW.x就不夠了,因為
SELECT IF(1<>NULL,1,0)
返回0與...相同
NULL<>NULL 1<>NULL 0<>NULL 'AAA'<>NULL
因此它不會跟蹤FROM和TO NULL的變化
這種情況下的正確方法是
((OLD.x IS NULL AND NEW.x IS NOT NULL) OR (OLD.x IS NOT NULL AND NEW.x IS NULL) OR (OLD.x<>NEW.x))
- 3 回答
- 0 關注
- 637 瀏覽
添加回答
舉報
0/150
提交
取消