HOWTO · PostgreSQL

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

Postgres에는 테이블에 행이 없으면 행을 삽입하는 UPSERT라는 메서드가 있습니다. 그렇지 않으면 행의 필드만 업데이트합니다.

이 페이지의 내용

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

또 다른 방법은 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 작업에 대한 자세한 내용은 다음 공식 문서를 참조하십시오.