삽입 중인 행이 이미 테이블에 있는 경우 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 |
최근댓글