1. ホーム
  2. database

[解決済み] SQLite UPSERT / UPDATE OR INSERT

2022-05-13 07:18:52

質問

SQLiteデータベースに対してUPSERT / INSERT OR UPDATEを実行する必要があります。

INSERT OR REPLACEというコマンドがありますが、これは多くの場合、便利です。しかし、外部キーのために自動インクリメントのある ID を維持したい場合、行を削除して新しい行を作成し、その結果この新しい行が新しい ID を持つことになるため、うまくいきません。

これがテーブルとなります。

players - (idの主キー、user_nameのユニークキー)

|  id   | user_name |  age   |
------------------------------
|  1982 |   johnny  |  23    |
|  1983 |   steven  |  29    |
|  1984 |   pepee   |  40    |

どのように解決するのですか?

遅ればせながらの回答です。2018年6月4日にリリースされたSQLIte 3.24.0から、ようやくサポートされたのが UPSERT 節がPostgreSQLの構文に準じています。

INSERT INTO players (user_name, age)
  VALUES('steven', 32) 
  ON CONFLICT(user_name) 
  DO UPDATE SET age=excluded.age;

注意: SQLite 3.24.0 より前のバージョンを使用する必要がある場合、以下を参照してください。 この回答 を参照してください(投稿者:私、@MarqueIV)。

しかし、アップグレードするオプションがある場合、あなたは 強くお勧めします。

というのも、私の解決策とは異なり、ここに投稿されたものは 1 つのステートメントで望ましい動作を実現するからです。さらに、通常より新しいリリースに付属する、他のすべての機能、改善、およびバグ修正も得られます。