2014-04-14 61 views
1

這是常見的,我有一個觸發器更新我的一個表中的date_last_modified字段。我遇到的問題有時需要手動調整date_last_modified字段中的時間戳。但是,當我這樣做時,觸發器會觸發並將其設置回到現在()。SQLite觸發器:只有當某個字段不包含在查詢中時,觸發器纔會採取行動?

這裏是我的觸發器:

CREATE TRIGGER Preference_on_update After UPDATE ON Preference for each row 
begin 
    update Preference set date_last_modified = datetime('now') 
    where rowid = old.rowid; 
end 

我想要做的是當更新不已經包括了date_last_modified字段中的值只有這觸發火災。如果更新語句包含date_last_modified,則觸發器不應調整任何內容。

我已經瀏覽了SQLite觸發器的文檔和語法,並且看到有一個「WHEN」子句,但是迄今爲止我的任何咒語都沒有成效。

可以這樣做嗎?

回答

1

觸發器可以限制在一組特定的列:

CREATE TRIGGER Preference_on_update 
AFTER UPDATE OF ID, Name, Value, Description ON Preference 
FOR EACH ROW 
BEGIN 
    ... 

然而,當日期與任何這些列在一起,改變了這種沒有幫助。

更好的辦法是檢查日期值是否實際發生了變化,即舊值和新值是否不同。 (<>始終是假的時,空值都參與其中,所以最好使用IS NOT NULL這裏。)

CREATE TRIGGER Preference_on_update 
AFTER UPDATE ON Preference 
FOR EACH ROW 
WHEN OLD.date_last_modified IS NOT NEW.date_last_modified 
BEGIN 
    ... 
+0

真棒!這看起來是解決這個問題的方法。如果有任何問題,我會給它一個旋轉,並在這裏發出噪音。 – Quangdog

+0

嗯...你的例子似乎總是會在「FOR EACH ROW」行中產生語法錯誤。看起來觸發器語法不喜歡你的不是比較。 但是,在看這裏的語法文檔:https://www.sqlite.org/syntaxdiagrams.html#expr它看起來你的語法應該是有效的。 難住。 – Quangdog

+0

'FOR EACH ROW'必須在'WHEN'之前出現。 –

相關問題