典型的な「新しいレコードを挿入するか、既存のレコードを更新するにはどうすればいいか」という質問に対する「おそらく」の解決策をいくつか見つけましたが、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"));