[MySQL] 중복 레코드 처리 방법

황인용·2021년 1월 4일
1

Database

목록 보기
14/16
post-thumbnail

중복 레코드

MySQL에서 테이블에 레코드를 INSERT할 때, PK가 DUPLICATE 되는 현상이 번번히 일어난다.

  • ex) 공간가격-날짜 복합키를 해당 테이블에 INSERT할 때, 중복일 경우
ERROR 1062 (23000): Duplicate entry 'SPAC00000001-2020-12-07' for key 'tb_guesthouse_price_calendar.PRIMARY'

따라서 위 와 같은 현상을 해결하고자 한다면,
해당 데이터를 INSERT하지 않거나, 해당 레코드를 UPDATE를 해야한다.
MySQL에서는 다음 3가지 방법으로 해결할 수 있다.


INSERT IGNORE

말 그대로 삽입(INSERT)하되, duplicate가 발생한다면, 해당 레코드는 무시하고 넘어가는 방법이다.
즉, ERROR를 무시하고 INSERT만 하는 명령어이다.

INSERT IGNORE INTO `USER`
(
    email
    , name
) VALUES 
('test01@gmail.com', 'test01')
;

Query OK, 0 rows affected (0.00 sec)
  • 기존에 'test01@gmail.com' 이라는 레코드가 있기 때문에, Query는 실행됬으나, 반영된 레코드의 수는 0 이다.

REPLCATE INTO

말 그대로 삽입(INSERT)하되, duplicate가 발생한다면, 기존의 레코드는 삭제가 되고, 새로운 PK로 Auto Increment가 되어 새로운 레코드로 삽입한다.

REPLCATE INTO `USER`
(
    email
    , name
) VALUES
('test01@gmail.com', 'test01')
;

Query OK, 2 rows affected (0.00 sec)
  • 기존에 해당하는 레코드가 있기 때문에, 기존것은 삭제되고 새로 INSERT 한다.
  • 따라서 Query는 실행되고, 2개의 레코드에 반영되었다.

ON DUPLICATE KEY UPDATE

역시 말 그대로 duplicate가 발생할 때, 해당 KEY에 대해서 수정(UPDATE)하는 명령어이다.
기존 레코드의 PK는 그대로 두고 UPDATE를 하기 때문에, REPLCATE INTO 처럼 PK가 새로 생성 될 필요 없다.

INSERT INTO `USER`
(
    email
    , name
    , phone_number
) VALUES 
('test01@gmail.com', 'test01', '01011112222')
ON DUPLICATE KEY UPDATE
name = 'test01'
, phone_number = '01011112222'
;

Query OK, 2 rows affected, 1 warning (0.00 sec)
  • 기존에 해당 데이터가 있기 때문에, Query는 실행됬고, 2개의 레코드에 반영되었으며, 1개의 warning이 발생한다.
  • warning은 수정되었기 때문에 발생한다.

MySQL 중복 레코드 처리방법 참고

profile
dev_pang의 pang.log

0개의 댓글