制約を追加したいので、新しい値が渡された場合はその列の値が更新されます。さもなければ、それは黙って無視するべきです。擬似コードの場合:新しい値が高い場合は列を更新するだけです
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句を使用してこの制約を適用すると、UPDATEの影響を受ける他の列(たとえばcol2
)は、その句がcolの値に基づいて一致を禁止すると更新されません。
制約が違反された場合、トリガーがUPDATEを無視する正しい構文を実行できませんでした。それにもかかわらず、トリガーを使用すると単純なMAX()呼び出しよりもはるかに大きなオーバーヘッドが発生すると思います。
トリガーはオーバーヘッドが大きくなる可能性がありますが、アプリケーションまたはスリープ状態に陥っていないデータベース設計者がトリガーを忘れたり無視したりすることはできません。 –
どのようなユースケースですか? –
これは、その列を設定するUPDATEクエリのWHERE句で管理する必要があります。データベースプログラマーの背後でそれを管理しなければならない場合は、トリガーが必要です。 – hardmath