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

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

蕪湖不蕪
TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超7個(gè)贊
我不能發(fā)表評(píng)論,所以請(qǐng)注意,如果你的列支持NULL值,OLD.x <> NEW.x就不夠了,因?yàn)?/p>
SELECT IF(1<>NULL,1,0)
返回0與...相同
NULL<>NULL 1<>NULL 0<>NULL 'AAA'<>NULL
因此它不會(huì)跟蹤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))
添加回答
舉報(bào)
0/150
提交
取消