2017-01-27 18 views
0

我有一個PHP腳本,用於更新MySQL表中的一行。該表具有觸發器設置,可在更新時將值存儲在第二個表中。MySQL更新導致觸發但不改變行

我發現一個奇怪的問題,對於特定的行,更新語句不會更改行,但確實觸發了觸發器並插入到第二個表中。我在「更新後」觸發 - 所以我不知道如何在基表中更新數據,但成功觸發「更新後」並插入到第二個表中。

有關什麼情況可能導致此問題或解決問題的任何想法?

編輯: 爲了進一步闡明 - UPDATE語句應該改變基表數據,但不是。但是,觸發器表目標正在反映更改,就像發生更新一樣。觸發器表用作日誌表 - 對基表的任何更改都會通過觸發器將數據快照插入到日誌表中。我在日誌表中看到了更改的記錄,但基本表中沒有實際更改。

+0

如果沒有示例模式或觸發器上下文的位,這可能是任何東西。細節在這裏重要。你能編輯你的問題以提供更具體的信息嗎? – tadman

+0

如果運行正確,您是否手動檢查觸發器?你可以在這裏展示你做了什麼? –

回答

1

對於特定行,update語句不會更改該行,但會觸發該觸發器並插入到第二個表中。

這很正常。 AFTER UPDATE觸發器仍然會觸發,即使UPDATE不會修改該行,因爲您嘗試使用SET的數據已經存在。

如果你想知道事情是否改變了,你必須測試它。

IF NOT (NEW.c1 <=> OLD.c1) THEN 
    /* do stuff */ 
END IF; 

使用NOT (... <=> ...)是一個帶有反轉的無效安全性真實性測試。 NOT (NULL <=> 1)評估爲TRUE,而NULL != 1評估爲NULL

+0

我的觸發器已經做了一個更改比較測試。所以澄清 - UPDATE語句設置了一個值,該值應該改變列數據。該更改反映在觸發器目標表中,但未反映在基本表中。 – lcdservices