Database

[MySQL] INSERT ~ ON DUPLICATE KEY UPDATE (insert or update)

비번변경 2023. 11. 16. 15:07

UPSERT

UPDATE, INSERT의 합성어로, 테이블에 추가하고자 하는 데이터의 기준 값이 데이블에 없으면 데이터를 추가하고 있으면 데이터를 갱신하는 것을 의미한다. 즉, INSERT OR UPDATE라고 할 수 있다.

데이터베이스 엔진마다 지원 여부와 문법이 다른데, MySQL은 INSERT ~ ON DUPLICATE KEY UPDATE 문으로 지원한다.

 

 

INSERT ~ ON DUPLICATE KEY UPDATE

INSERT INTO table(key1, key2, col1, col2) VALUES(val1, val2, val3, val4)
ON DUPLICATE KEY UPDATE col1 = val3, col2 = val4;

INSERT문에 ON DUPLICATE KEY UPDATE을 지정하면, 추가할 행의 UNIQUE 인덱스나 PRIMARY KEY에 중복이 발생하는 경우 UPDATE가 수행된다. 참고로 키 값을 제외하고 변경 작업을 수행한다. 

 

 

예시

위와 같이 PK NAME과 EMAIL 컬럼으로 구성된 users 테이블이 존재하고, 데이터가 이미 저장되어 있다고 하자.

CREATE TABLE users (
    NAME    VARCHAR(10),
    EMAIL   VARCHAR(50),
    PRIMARY KEY (NAME)
);

INSERT INTO users(NAME, EMAIL) VALUES 
('june', 'june@tistory.com'),
('passwd', 'passwd@tistory.com')
;

현재 상태에 다음과 같은 INSERT 문을 수행하면 Duplicate entry '' for key 'users.PRIMARY' 오류가 발생한다. PK인 NAME 컬럼에 이미 june이라는 값이 존재하기 때문이다.

INSERT INTO users(NAME, EMAIL) VALUES
('june', 'june@help.com')
;

이런 경우, ON DUPLICATE KEY UPDATE로 데이터 추가 또는 갱신을 수행할 수 있다.

INSERT INTO users(NAME, EMAIL) VALUES
('june', 'june@help.com')
ON DUPLICATE KEY UPDATE EMAIL = 'june@help.com';

 

 

 

참고 문서

https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

https://sqlperformance.com/2020/09/locking/upsert-anti-pattern

https://blog.wookoa.com/100

 

728x90