3
我想添加一個約束,所以如果傳入的新值大於其當前值,那麼只更新其值。否則,它應該默默地忽略。在僞代碼中:如果新值更高,只更新列
CREATE TABLE t (col INTEGER CHECK (new.value > col.value) ON CONFLICT IGNORE)
SQLite 3.7.4。
我想添加一個約束,所以如果傳入的新值大於其當前值,那麼只更新其值。否則,它應該默默地忽略。在僞代碼中:如果新值更高,只更新列
CREATE TABLE t (col INTEGER CHECK (new.value > col.value) ON CONFLICT IGNORE)
SQLite 3.7.4。
我已決定使用MAX()
:
UPDATE t SET col = MAX(col, newval) [, col2 = xxx, ...]
雖然技術上它確實覆蓋值,至少它不能降低。
當使用WHERE子句來強制執行此約束時,如果子句基於col的值禁止匹配,則UPDATE影響的其他列(例如col2
)將不會更新。
我無法確定觸發器的正確語法,以便在違反約束時忽略UPDATE。無論如何,我會想象使用觸發器會比簡單的MAX()調用帶來更大的開銷。
雖然觸發器可能會導致更大的開銷,但觸發器不會被應用程序或睡眠剝奪數據庫設計器遺忘或忽略。 –
什麼是用例? –
這應該在設置該列的任何UPDATE查詢中使用WHERE子句進行管理。如果你必須在數據庫程序員的背後管理它,你需要一個觸發器。 – hardmath