2026, 새로운 도약을 시작합니다.

mysql/MariaDB INSERT시 중복키 관리방법 (ON DUPLICATE KEY UPDATE)

검색하다보니 없는거같아서 남깁니다.

대부분 아시겠지만 데이터가 있으면 update하고 없으면 insert 하는구문..

간혹 필요한데 자주안쓰다보니 까먹더라구요.

데이터가 있으면 update하고 없으면 insert 하는구문..

예를들어 상품 테이블이 아래와 같고

goods_no primary key auto_increment  
goods_code varchar(20)  
goods_name varchar(50)  

이미 아래 데이터가 존재할경우

goods_no goods_code goods_name
1 A00001 모하비고스트

INSERT INTO 상품테이블 (goods_code, goods_name)

VALUES('A00001', '모하비고스트향수')

ON DUPLICATE KEY UPDATE goods_name='모하비고스트향수';

쿼리를 실행하면

goods_name부분이 '모하비고스트향수'로 바뀔거 같지만

계속 INSERT만 됩니다.

중요한건 UNIQUE INDEX

goods_no primary key auto_increment  
goods_code varchar(20) UNIQUE INDEX
goods_name varchar(50)  

요렇게 하면 의도하는 대로 상품명만 '모하비고스트향수'로 바뀌게됩니다.

중복키관리는 이거외에 REPLACE INTO와 INSERT IGNORE가 더 있는데..

REPLACE INTO 는  기존데이터 삭제후 INSERT 하는 방식이라 고유 id값을 다른부분에서 사용한다면

골때리는 상황이 발생할수가 있습니다.(직접겪었.. ㅠㅠ)

INSERT IGNORE 는 중복 에러발생시 입력을 무시하는 방식. 

그래서 on duplicate update 방식이 젤 좋은방식이 아닌가 생각됩니다.

예전에 어떤 사이트에서 on duplicate update 를 퍼포먼스 등의 문제로 사용하지 말라는 글을

얼핏 보긴했는데 해당부분을 다시 찾아봤는데 못찾겠네요.

혹시 찾으시면 공유 부탁드립니다^^;

|

댓글 6개

이거 사용할 때 주의해야 할 점이 auto_increment 를 무조건 +1 시킵니다.
있어도 없어도 무조건 1개의 쿼리로 보고 auto_increment 를 증가시킵니다.
last_insert_id 를 사용해야 하는 경우가 있다면 주의가 필요합니다.

https://sir.kr/pg_tip/16737
이거랑 같이 보면 좋을듯 싶네요.
replace into 는 auto_increment 증가시키는걸로 알고있는데
on duplicate update도 그런가요?
한번더 확인해보겠습니다. 감사합니다!^^
저도 그랬던걸로 기억하고 있었는데 프로그램 짤 때 이상하게 last_insert_id 가 안맞더라구요.
음...1여년 전에 짠거라 제 기억이 잘못되었을 수도 있겠네요. 저도 소스 다시 한 번 뒤져봐야겠습니다. (날이 갈수록 기억력이 떨어지네요.ㅠㅠ)
감사합니다 얼떨결에 예전에 한번 써봤던거 같은데 잊고 있었네요
좋은정보 감사합니다.

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

개발자팁

개발과 관련된 유용한 정보를 공유하세요.
질문은 QA에서 해주시기 바랍니다.
번호 분류 제목 글쓴이 날짜 조회
5402 MySQL 6일 전 조회 21
5401 JavaScript 3주 전 조회 117
5400 MySQL 1개월 전 조회 223
5399 PHP 2개월 전 조회 470
5398 PHP 2개월 전 조회 353
5397 PHP 2개월 전 조회 286
5396 기타 5개월 전 조회 559
5395 PHP 6개월 전 조회 1,196
5394 MySQL 7개월 전 조회 793
5393 웹서버 9개월 전 조회 985
5392 1년 전 조회 1,310
5391 11개월 전 조회 1,319
5390 11개월 전 조회 1,114
5389 10개월 전 조회 1,030
5388 10개월 전 조회 1,170
5387 9개월 전 조회 963
5386 JavaScript 9개월 전 조회 1,148
5385 웹서버 9개월 전 조회 1,169
5384 JavaScript 10개월 전 조회 991
5383 기타 11개월 전 조회 1,417
5382 기타 11개월 전 조회 661
5381 JavaScript 11개월 전 조회 1,075
5380 기타 11개월 전 조회 834
5379 JavaScript 11개월 전 조회 831
5378 1년 전 조회 1,397
5377 기타 1년 전 조회 941
5376 jQuery 1년 전 조회 639
5375 jQuery 1년 전 조회 871
5374 기타 1년 전 조회 949
5373 MySQL 1년 전 조회 980
🐛 버그신고