2011-06-19 4 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句を使用してこの制約を適用すると、UPDATEの影響を受ける他の列(たとえばcol2)は、その句がcolの値に基づいて一致を禁止すると更新されません。

制約が違反された場合、トリガーがUPDATEを無視する正しい構文を実行できませんでした。それにもかかわらず、トリガーを使用すると単純なMAX()呼び出しよりもはるかに大きなオーバーヘッドが発生すると思います。

+0

トリガーはオーバーヘッドが大きくなる可能性がありますが、アプリケーションまたはスリープ状態に陥っていないデータベース設計者がトリガーを忘れたり無視したりすることはできません。 –

関連する問題