PostgreSQL が存在する場合は挿入または更新

Shihab Sikder 2023年6月20日
  1. 行が存在する場合はサブクエリを使用して行を挿入または更新する
  2. 行が存在する場合、UPSERT を使用して行を挿入または更新する
PostgreSQL が存在する場合は挿入または更新

挿入または更新が存在する場合、それらを実行するには 2つの方法があります。 サブクエリを使用して、行がテーブルに存在するかどうかを確認できます。

別の方法として、UPSERT メソッドを使用できます。

行が存在する場合はサブクエリを使用して行を挿入または更新する

id が主キーである、次のようなテーブルがあるとします。

postgres=# select * from users;
 id |        name        |   gender   | age
----+--------------------+------------+-----
  1 | Tymothy Blezard    | Polygender |  21
  2 | Carlynne Renak     | Female     |  30
  3 | Hewitt Mylechreest | Male       |  26
  4 | Griswold Geer      | Male       |  30
  5 | Kelley Vines       | Female     |  22
  6 | Ted Haizelden      | Male       |  27
  7 | Bonita Glewe       | Female     |  27
  8 | Edgar Hambers      | Male       |  22
  9 | Johnathan Dwelley  | Male       |  22
 10 | Fritz Rylance      | Male       |  22
(10 rows)

次のような新しい行を追加しましょう。

postgres=# Update Users set name='Tymothy', gender='Male', age=21 WHERE id=1;
UPDATE 1
postgres=# select * from users order by id;
 id |        name        | gender | age
----+--------------------+--------+-----
  1 | Tymothy            | Male   |  21
  2 | Carlynne Renak     | Female |  30
  3 | Hewitt Mylechreest | Male   |  26
  .
  .

これで、1 に等しい id を持つ行が正常に更新されたことがわかります。 ただし、id11 に等しい行、またはテーブルに存在しない別の id を更新する場合は、UPDATE 0 が発生します。

postgres=# Update Users set name='Tymothy', gender='Male', age=21 WHERE id=11;
UPDATE 0

テーブルに存在しない場合に行を挿入するサブクエリを作成しましょう。 たとえば、次の Update 操作を実行します。

Update Users set name='John Kane', gender='Male', age=21 WHERE id=12;

したがって、私たちの解決策は次のようになります。

UPDATE Users set name='John Kane', gender='Male', age=21 WHERE id=12;

INSERT INTO Users (id,name,gender,age)
SELECT 12,'John kane','Male',21
WHERE NOT EXISTS (SELECT 1 from Users WHERE id=12);

出力は次のとおりです。

postgres=# select * from users order by id desc;
 id |        name        | gender | age
----+--------------------+--------+-----
 12 | John kane          | Male   |  21
 10 | Fritz Rylance      | Male   |  22

行が存在する場合、UPSERT を使用して行を挿入または更新する

アップサートの一般的な使用方法は次のとおりです。

INSERT INTO customers (name, email)
VALUES('field1_value','field2_value')
ON CONFLICT (unique_field)
DO
  UPDATE SET field2 = "new_field_value";

私たちの場合、13id を持つ年齢を更新してみましょう。 したがって、クエリは次のようになります。

INSERT INTO users (id,name, gender,age)
VALUES(12,'John kane','Male',23)
ON CONFLICT (id)
DO
  UPDATE SET age = 24;

postgres=# select * from users order by id desc;

 id |        name        |   gender   | age
----+--------------------+------------+-----
 12 | John Kane          | Male       |  24
 10 | Fritz Rylance      | Male       |  22
  9 | Johnathan Dwelley  | Male       |  22

UPSERT が指定された ID との競合を検出したため、更新されていることがわかります。 競合が見つからない場合は、INSERT 操作を実行します。

UPSERT 操作の詳細については、次の公式 ドキュメント を参照してください。

著者: Shihab Sikder
Shihab Sikder avatar Shihab Sikder avatar

I'm Shihab Sikder, a professional Backend Developer with experience in problem-solving and content writing. Building secure, scalable, and reliable backend architecture is my motive. I'm working with two companies as a part-time backend engineer.

LinkedIn Website