존재하는 경우 PostgreSQL 삽입 또는 업데이트

Shihab Sikder 2023년6월20일
  1. 하위 쿼리를 사용하여 행이 있는 경우 삽입 또는 업데이트
  2. UPSERT를 사용하여 행이 있는 경우 삽입 또는 업데이트
존재하는 경우 PostgreSQL 삽입 또는 업데이트

존재하는 경우 삽입 또는 업데이트를 수행하는 두 가지 방법이 있습니다. 하위 쿼리를 사용하여 해당 행이 테이블에 있는지 확인할 수 있습니다.

또 다른 방법은 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
  .
  .

이제 id1인 행을 성공적으로 업데이트했음을 알 수 있습니다. 그러나 id11이거나 테이블에 없는 다른 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";

우리의 경우 id13인 연령을 업데이트해 보겠습니다. 따라서 쿼리는 다음과 같습니다.

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 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