存在しない場合は挿入し、そうでなければ更新しますか? 質問する

存在しない場合は挿入し、そうでなければ更新しますか? 質問する

典型的な「新しいレコードを挿入するか、既存のレコードを更新するにはどうすればいいか」という質問に対する「おそらく」の解決策をいくつか見つけましたが、SQLite ではどれも機能しません。

次のように定義されたテーブルがあります。

CREATE TABLE Book 
ID     INTEGER PRIMARY KEY AUTOINCREMENT,
Name   VARCHAR(60) UNIQUE,
TypeID INTEGER,
Level  INTEGER,
Seen   INTEGER

私がやりたいのは、一意の名前を持つレコードを追加することです。名前がすでに存在する場合は、フィールドを変更します。

誰かこれをどうやってやるのか教えてもらえませんか?

ベストアンサー1

見てhttp://sqlite.org/lang_conflict.html

次のようなものがほしいです:

insert or replace into Book (ID, Name, TypeID, Level, Seen) values
((select ID from Book where Name = "SearchName"), "SearchName", ...);

挿入リストにないフィールドは、行がすでにテーブルに存在する場合は NULL に設定されることに注意してください。これが、列のサブセレクトが存在する理由です。ID置換の場合、ステートメントはそれを NULL に設定し、新しい ID が割り当てられます。

この方法は、置換の場合は行の特定のフィールド値をそのままにしておき、挿入の場合はフィールドを NULL に設定する場合にも使用できます。

たとえば、Seenそのままにしておきたいとします。

insert or replace into Book (ID, Name, TypeID, Level, Seen) values (
   (select ID from Book where Name = "SearchName"),
   "SearchName",
    5,
    6,
    (select Seen from Book where Name = "SearchName"));

おすすめ記事