2

UPDATE と「INSERT OR REPLACE INTO」の違いを説明するこの投稿を見つけました。それはそれを説明します

INSERT OR REPLACE INTO names (id, name) VALUES (1, "John")

id =1 のレコードが存在しない場合は新しい行を挿入し、存在する場合は id = 1 の行を置き換えます。私の質問は、「id」がレコードが既に存在するかどうかを決定する値を持つフィールドであることをどのように認識または決定するのですか?

言い換えれば、sqlite が name = "John" のレコードを検索して id 値を置き換えないのはなぜでしょうか? これは、上記の例で説明されていないインデックスに依存するのでしょうか?それとも、SQLite は「id」という名前のフィールドまたはフィールド名の行の最初に名前が付けられたフィールドを特別に扱うのでしょうか?

4

1 に答える 1

4

これがどのように処理されるかについては、 CONFLICT句のドキュメントを参照してください。基本的に、これは UNIQUE および NOT NULL 制約に基づいています (主キーは、更新するか挿入するかを選択するための制約としてかなり一般的です)。

UNIQUE 制約違反が発生すると、REPLACE アルゴリズムは、現在の行を挿入または更新する前に、制約違反の原因となっている既存の行を削除し、コマンドは通常どおり実行を続けます。NOT NULL 制約違反が発生した場合、REPLACE 競合解決により NULL 値がその列のデフォルト値に置き換えられます。列にデフォルト値がない場合は、ABORT アルゴリズムが使用されます。CHECK 制約違反が発生した場合、REPLACE 競合解決アルゴリズムは常に ABORT のように機能します。

REPLACE 競合解決戦略が制約を満たすために行を削除する場合、再帰トリガーが有効になっている場合に限り、削除トリガーが起動します。

REPLACE 競合解決戦略によって削除された行に対しては、更新フックは呼び出されません。また、REPLACE は変更カウンターをインクリメントしません。この段落で定義されている例外的な動作は、将来のリリースで変更される可能性があります。

于 2012-09-11T09:32:33.643 に答える