PostgreSQL が存在する場合は挿入または更新
Shihab Sikder
2023年6月20日
挿入または更新が存在する場合、それらを実行するには 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
を持つ行が正常に更新されたことがわかります。 ただし、id
が 11
に等しい行、またはテーブルに存在しない別の 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";
私たちの場合、13
の id
を持つ年齢を更新してみましょう。 したがって、クエリは次のようになります。
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