존재하는 경우 PostgreSQL 삽입 또는 업데이트
Shihab Sikder
2023년6월20일
존재하는 경우 삽입 또는 업데이트를 수행하는 두 가지 방법이 있습니다. 하위 쿼리를 사용하여 해당 행이 테이블에 있는지 확인할 수 있습니다.
또 다른 방법은 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
.
.
이제 id
가 1
인 행을 성공적으로 업데이트했음을 알 수 있습니다. 그러나 id
가 11
이거나 테이블에 없는 다른 id
로 행을 업데이트하려는 경우 UPDATE 0
이 발생합니다.
postgres=# Update Users set name='Tymothy', gender='Male', age=21 WHERE id=11;
UPDATE 0
테이블에 없는 경우 행을 삽입하는 하위 쿼리를 만들어 봅시다. 예를 들어 다음 업데이트
작업을 수행하려고 합니다.
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
를 사용하여 행이 있는 경우 삽입 또는 업데이트
다음은 upsert를 사용하는 일반적인 방법입니다.
INSERT INTO customers (name, email)
VALUES('field1_value','field2_value')
ON CONFLICT (unique_field)
DO
UPDATE SET field2 = "new_field_value";
우리의 경우 id
가 13
인 연령을 업데이트해 보겠습니다. 따라서 쿼리는 다음과 같습니다.
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