삽입 중인 행이 이미 테이블에 있는 경우 PostgreSQL upsert 기능을 사용하여 데이터를 삽입하거나 업데이트하는 방법

 

관계형 데이터베이스에서 upsert라는 용어는 병합이라고 합니다. 

테이블에 새 행을 삽입 할 때 PostgreSQL은 행이 이미 있는 경우 해당 행 을 업데이트 하고, 그렇지 않으면 새 행을 삽입합니다.

upsert는 insert + update 입니다.

INSERT ON CONFLICT
INSERT INTO table_name(column_list) 
VALUES(value_list)
ON CONFLICT target action;
  • (column_name) – 열 이름.
  •  ON CONSTRAINT constraint_name– 여기서 제약 조건 이름은 UNIQUE 제약 조건의 이름일 수 있습니다 .
  •  WHERE predicate– 술어가 있는 WHERE 절 .

action으로는 다음 중 하나가 될 수 있습니다 :

  •  DO NOTHING – 행이 이미 테이블에 있는 경우 아무 작업도 수행하지 않음을 의미합니다.
  •  DO UPDATE SET column_1 = value_1, .. WHERE condition – 테이블의 일부 필드를 업데이트합니다.
MySQL  insert on duplicate key update 문과 유사합니다.
반응형

DROP TABLE IF EXISTS customers;

CREATE TABLE customers (
	customer_id serial PRIMARY KEY,
	name VARCHAR UNIQUE,
	email VARCHAR NOT NULL,
	active bool NOT NULL DEFAULT TRUE
);
INSERT INTO 
    customers (name, email)
VALUES 
    ('IBM', 'contact@ibm.com'),
    ('Microsoft', 'contact@microsoft.com'),
    ('Intel', 'contact@intel.com');

 

Microsoft 연락처에 대해서 update를 해봅니다.

INSERT INTO customers (NAME, email)
VALUES('Microsoft','hotline@microsoft.com') 
ON CONFLICT ON CONSTRAINT customers_name_key 
DO NOTHING;

-- same
INSERT INTO customers (name, email)
VALUES('Microsoft','hotline@microsoft.com') 
ON CONFLICT (name) 
DO NOTHING;

 

upsert 

INSERT INTO customers (name, email)
VALUES('Microsoft','hotline@microsoft.com') 
ON CONFLICT (name) 
DO 
   UPDATE SET email = EXCLUDED.email || ';' || customers.email;

 

반응형

'SW ENGINEERING > Postgres' 카테고리의 다른 글

[PostgreSQL] Import CSV File & export CSV File  (0) 2021.09.06
[PostgreSQL] BASIC - Transaction  (0) 2021.09.06
[PostgreSQL] BASIC - DELETE  (0) 2021.09.06
[PostgreSQL] BASIC - UPDATE Join  (0) 2021.09.06
[PostgreSQL] BASIC - UPDATE  (0) 2021.09.06
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기