본문 바로가기
IT/SQL 기초강좌 (PostgreSQL)

39강 SQL이 뭐지? PostgreSQL Upsert

by DoitSQL 2022. 12. 21.
728x90

39강 SQL이 뭐지? PostgreSQL Upsert   

PostgreSQL

SQL이 뭐지? 39강 시작합니다.

 

이번 강의에서는

 PostgreSQL Upsert Using INSERT ON CONFLICT statement

에 대해서 알아보겠습니다.

 

삽입할 행이 테이블에 이미 있는 경우 데이터를 삽입하거나 업데이트하는 SQL Upsert 기능을 공부합니다.


Introduction to the PostgreSQL upsert   

관계형 데이터베이스에서 업스터라는 용어는 병합이라고 합니다. 이 아이디어는 테이블에 새 행을 삽입하면 PostgreSQL은 행이 이미 있으면 업데이트하고, 그렇지 않으면 새 행을 삽입합니다. 그것이 우리가 그 행동을 업스터(업데이트 또는 삽입의 조합)라고 부르는 이유이다.

PostgreSQL에서 Upsert 기능을 사용하려면, 다음과 같이 INSERT ON CONFILT 문을 사용합니다.

INSERT INTO table_name(column_list) 
VALUES(value_list)
ON CONFLICT target action;   

 

PostgreSQL은 업스터 기능을 지원하기 위해 INSERT 문에 ON CONTROL Target action 절을 추가했습니다.

이 문에서 대상은 다음 중 하나일 수 있습니다.
● (columnn_name) – 열 이름입니다.
●  ON CONSTRANT constraint_name – 여기서 제약 조건 이름은 고유 제약 조건의 이름일 수 있습니다.
●  WHERE 술어 – 술어가 있는 WHERE 절입니다.

 

작업은 다음 중 하나일 수 있습니다.
● 아무것도 안 함 – 행이 테이블에 이미 있는 경우 아무것도 안 함을 의미합니다.
● DO UPDATE SET column_1 = value_1, .. WHERE 조건 – 테이블의 일부 필드를 업데이트합니다.

 

ON CONTROLT 절은 Postgre에서만 사용할 수 있습니다.SQL 9.5. 이전 버전을 사용하는 경우 업스터 기능을 사용하려면 해결 방법이 필요합니다.

 

MySQL에서도 작업하는 경우 업스터 기능이 MySQL의 중복 키 업데이트 시 삽입문과 유사하다는 것을 알 수 있습니다.

 

PostgreSQL upsert examples   

다음 문장은 PostgreSQL 업스터 기능을 시연하기 위해 customers라는 새로운 테이블을 작성합니다.

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

commit;   

 

고객 테이블은 customer_id, 이름, e-메일 및 활성의 4개 열로 구성됩니다. 이름 열에는 고객 이름의 고유성을 보장하기 위한 고유한 제약 조건이 있습니다.

다음 INSERT 문은 일부 행을 고객 테이블에 삽입합니다.

INSERT INTO 
    customers (name, email)
VALUES 
    ('IBM', 'contact@ibm.com'),
    ('Microsoft', 'contact@microsoft.com'),
    ('Intel', 'contact@intel.com');

commit;   

 

 

Microsoft에서 연락처 전자 메일을 contact@microsoft.com에서 hotline@microft.com으로 변경한 경우 UPDATE 문을 사용하여 업데이트할 수 있습니다. 그러나 업스터 기능을 시연하기 위해

다음과 같은 INSERT ON CONFLICT 문을 사용합니다.

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

고객 테이블에 고객 이름이 있으면 무시하십시오(do nothing).

다음 문은 위 문과 동일하지만 INSERT 문의 대상으로 고유 제약 조건 이름 대신 이름 열을 사용합니다.

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


이미 존재하는 고객을 삽입할 때 새 전자 메일을 이전 전자 메일과 연결하려고 합니다. 이 경우 다음과 같이 UPDATE 절을 INSERT 문의 작업으로 사용합니다.

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


INSERT ON CONFILT 문을 사용하여 SQL 업스터 기능을 구현하였습니다.

 

ON CONFLICT 일 때 DO 다음에 UPDATE

 

수고하셨습니다.


본 강의는 PostgreSQL Tutorial을 참조합니다. 

 

PostgreSQL Tutorial - Learn PostgreSQL from Scratch

Welcome to the PostgreSQLTutorial.com website! This PostgreSQL tutorial helps you understand PostgreSQL quickly. You’ll master PostgreSQL very fast through many practical examples and apply the knowledge in developing applications using PostgreSQL. If yo

www.postgresqltutorial.com

실습용 테이블에 대해서는 3강을 참조하세요.

 

3강 SQL이 뭐지? 도구들을 설치해보자. ( PostgreSQL, HeidiSQL )

지난 시간까지 SQL이 뭔지 대충 감을 잡는 시간을 가졌습니다. 이번 시간에는 본격적인 SQL을 공부하기 위해서 도구들을 설치해 보겠습니다. 1. PostgreSQL 설치 ( Windows10 64bit 기준


Do it! SQL을 찾아 주셔서 감사합니다. 공감 ♥ , 댓글이 큰 힘이 됩니다.

 

728x90

댓글