亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

MySQL僅在行已更改時才更新

MySQL僅在行已更改時才更新

蝴蝶不菲 2019-08-12 17:18:19
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;

在您的示例中,這將使它更新(并因此覆蓋行而不是三行。


查看完整回答
反對 回復 2019-08-12
?
蕪湖不蕪

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))


查看完整回答
反對 回復 2019-08-12
  • 3 回答
  • 0 關注
  • 637 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號