2011-06-19 57 views
3

我想添加一個約束,所以如果傳入的新值大於其當前值,那麼只更新其值。否則,它應該默默地忽略。在僞代碼中:如果新值更高,只更新列

CREATE TABLE t (col INTEGER CHECK (new.value > col.value) ON CONFLICT IGNORE) 

SQLite 3.7.4。

+0

什麼是用例? –

+0

這應該在設置該列的任何UPDATE查詢中使用WHERE子句進行管理。如果你必須在數據庫程序員的背後管理它,你需要一個觸發器。 – hardmath

回答

3

我已決定使用MAX()

UPDATE t SET col = MAX(col, newval) [, col2 = xxx, ...] 

雖然技術上它確實覆蓋值,至少它不能降低。

當使用WHERE子句來強制執行此約束時,如果子句基於col的值禁止匹配,則UPDATE影響的其他列(例如col2)將不會更新。

我無法確定觸發器的正確​​語法,以便在違反約束時忽略UPDATE。無論如何,我會想象使用觸發器會比簡單的MAX()調用帶來更大的開銷。

+0

雖然觸發器可能會導致更大的開銷,但觸發器不會被應用程序或睡眠剝奪數據庫設計器遺忘或忽略。 –