web-dev-qa-db-ja.com

SQLite "INSERT OR REPLACE INTO" vs. "UPDATE ... WHERE"

以前にSQLで使用されていたINSERT OR REPLACE INTO names (id, name) VALUES (1, "John")という構文を見たことがありません。なぜUPDATE names SET name = "John" WHERE id = 1。一方を他方よりも使用する正当な理由はありますか。この構文はSQLiteに固有ですか?

58
nevan king

行が存在しない場合、UPDATEは何もしません。

INSERT OR REPLACEは行が存在しない場合は挿入し、存在する場合は値を置換します。

86
Adriaan Stander

私は現在、そのようなステートメントに取り組んでおり、注意すべき別の事実を見つけました:INSERT OR REPLACEはステートメントで指定されていない値を置き換えます。たとえば、テーブルに「lastname」列が含まれている場合値を指定しなかった場合、INSERT OR REPLACEは、可能であれば「ラストネーム」を無効にします(制約により許可されます)、または失敗します。

31
cybergen
REPLACE INTO table(column_list) VALUES(value_list);

の短い形式です

INSERT OR REPLACE INTO table(column_list) VALUES(value_list);

REPLACEを正しく実行するには、単純な主キーまたは一意のインデックスに関係なく、テーブル構造に一意の行が必要です。

REPLACEは、レコードを削除してからINSERTし、セットアップがある場合はINSERTトリガーを実行します。 INSERTのトリガーがある場合、問題が発生する可能性があります。


これは回避策です。速度をチェックしません。

INSERT OR IGNORE INTO table (column_list) VALUES(value_list);

に続く

UPDATE table SET field=value,field2=value WHERE uniqueid='uniquevalue'

このメソッドを使用すると、トリガーを発生させずに置換を実行できます。

8
PodTech.io

Id = 1が存在しない場合、挿入または置換クエリは新しいレコードを挿入します。

更新クエリは、存在する場合はid = 1のみを出力し、存在しない場合は新しいレコードを作成しません。

4
Anonym