반응형
쿼리를 만들다 보면 데이터가 들어 올 때 유니크 값이 중복이면 나머지 컬럼을 업데이트하고 싶은 경우가 있다
물론 일일이 업데이트해도 되지만
데이터 여러 개를 하고 싶을 때 유용한 옵션이 있다
그건 바로 아래 insert의 옵션이다
ON DUPLICATE KEY UPDATE
간단하게 예시를 들자면
다음과 같은 DDL이 있다고 치자
CREATE TABLE books (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) UNIQUE,
description TEXT,
author VARCHAR(255)
);
그리고 여기에 데이터를 넣자 여기도 해당 옵션을 넣었지만 바뀐 건 없고 5개의 칼럼이 추가된다
INSERT INTO books (name, description, author) VALUES
('왕좌의 게임', '왕좌의 게임에 대한 설명', '조지 R. R. 마틴'),
('해리포터', '해리포터에 대한 설명', 'J.K. 롤링'),
('포켓몬스터', '포켓몬스터에 대한 설명', '니틴 시로타'),
('클린코드', '클린코드에 대한 설명', '로버트 C. 마틴'),
('GoLang', 'GoLang에 대한 설명', 'Ken Thompson')
ON DUPLICATE KEY UPDATE description=VALUES(description), author=VALUES(author);
여기에 description 부분만 바꾼 쿼리를 실해해 보자
INSERT INTO books (name, description, author)
VALUES
('왕좌의 게임', '왕좌의 게임은 조지 R.R. 마틴이 쓴 판타지 소설 시리즈입니다.', '조지 R.R. 마틴'),
('해리포터', '해리포터는 J.K. 롤링이 쓴 판타지 소설 시리즈입니다.', 'J.K. 롤링'),
('포켓몬스터', '포켓몬스터는 게임프리크가 만든 일본의 만화 작품입니다.', '게임프리크'),
('클린코드', '클린코드는 로버트 C. 마틴이 쓴 소프트웨어 공학 책입니다.', '로버트 C. 마틴'),
('GoLang', 'GoLang은 구글이 개발한 프로그래밍 언어입니다.', '구글')
ON DUPLICATE KEY UPDATE
description = VALUES(description);
이러면 다음 결과 값이 뜨며 종료되는데
아래를 유심히 보면 10개의 row가 affected 됐다는 걸 알 수 있다
Query OK, 10 rows affected, 1 warning (0.00 sec)
Records: 5 Duplicates: 5 Warnings: 1
엥? 나는 5개인데 할 수 있지만
쿼리 실행 로직이 탐색한 횟수 + 업데이트 횟수로 계산된다 그래서 10개다
전체 Query를 실행하면 다음과 같다
반응형
'MySQL' 카테고리의 다른 글
[MySQL] 실행 계획(Query Plan)이 뭔데 (0) | 2023.12.02 |
---|---|
[MySQL] 뷰(View) 사용법 (0) | 2020.12.30 |
[MySQL] 함수(Function) 사용법 (0) | 2020.12.29 |
[MySQL] 트랜잭션(Transaction) 사용법 (0) | 2020.12.29 |
[MySQL] 트리거(Trigger) 사용법 (0) | 2020.12.29 |