随時翻訳を続けています。
ON CONFLICT clause
| conflict-clause ::= | ON CONFLICT conflict-algorithm |
| conflict-algorithm ::= | ROLLBACK | ABORT | FAIL | IGNORE | REPLACE |
ON CONFLICT 句は、個別の SQL コマンドではありません。 多くの他の SQL コマンドで出現できる非標準句です。 標準 SQL の一部ではなく、従ってよく知られていないかもしれないので、このドキュメントに セクションを設けました。
ON CONFLICT 句の構文は CREATE TABLE コマンド上で見られます。 INSERT と UPDATE コマンドでは、"ON CONFLICT" キーワードは構文がより自然に見えるように "OR" で置き換えられます。 たとえば、"INSERT ON CONFLICT IGNORE" の代わりに "INSERT OR IGNORE" があります。 キーワードが変わっても句の意味はどちらも同じです。
ON CONFLICT 句は、制約競合の解決に使うアルゴリズムを指定します。 ROLLBACK、ABORT、FAIL、IGNORE、REPLACE の5つの選択肢があります。 デフォルトのアルゴリズムは ABORT です。 それらの意味は以下の通り。
- ROLLBACK
-
制約違反が起こると、即座に ROLLBACK が起こり、現在のトランザクションを終了し、 SQLITE_CONSTRAINT を戻り値にコマンドを終了します。 トランザクションが(すべてのコマンド上で引き起こされる暗黙のトランザクション以外) アクティブでない場合、このアルゴリズムは ABORT と同じように機能します。
- ABORT
-
制約違反が起こると、コマンドは事前の変更をすべて取り消し、SQLITE_CONSTRAINT を戻り値に 終了します。 しかし、ROLLBACK は実行されず、同じトランザクション中の事前のコマンドによる変更は 保持されます。 これはデフォルトの動作です。
- FAIL
-
制約違反が起こると、コマンドは SQLITE_CONSTRAINT を戻り値に終了します。 しかし、コマンドが制約違反に遭遇する前に行ったデータベースに対する変更は維持され、 取り消されることはありません。 たとえば、更新を試みる100番目の行で制約違反に遭遇した場合、最初の99行の変更は 維持されますが、100行目以降は変更されません。
- IGNORE
-
制約違反が起こると、制約違反を含む行は挿入も変更もされません。 しかし、コマンドは通常通り実行を続けます。 制約違反を含む行の前後の行は、通常通り更新や挿入され続けます。 エラーは返されません。
- REPLACE
-
UNIQUE 制約違反が起こると、現在行の挿入や更新の前に制約違反を起こしている既存の行が 取り除かれます。 従って常に挿入あるいは更新が起こります。 コマンドは通常通り実行し続けます。 エラーは返されません。 NOT NULL 制約違反が起こった場合、NULL 値は、そのカラムのためのデフォルト値で 置き換えられます。 カラムがデフォルト値を持たない場合、ABORT アルゴリズムが使われます。
この競合解消方針が制約を満たすために行を削除するとき、それらの行について デリートトリガーは呼び出しません。 しかし、これは将来のリリースでは変更されるかもしれません。
INSERT あるいは UPDATE の OR 句で指定したアルゴリズムは CREATE TABLE で指定された どのようなアルゴリズムよりも優先されます。 アルゴリズムがどこにも指定されない場合、ABORT アルゴリズムが使われます。