Intro

이번 포스트에서는 MySQL에서 키가 중복되는 경우 INSERT 하거나 UPDATE 하는 방법에 대해 다루겠습니다.



중복값 처리

Merge (ON DUPLICATE KEY)

Key 혹은 Unique Index 가 중복인 값에 대해 별도처리를 하는 방법입니다.
Oracle 에서는 Merge가 있지만, MySQL에서는 따로 Merge 명령어가 없으므로 ON DUPLICATE KEY 구문을 사용합니다.

1
2
3
4
5
INSERT INTO tbl_a (col1, col2, col3)
VALUES ('val1', 'val2', 'val3')
ON DUPLICATE KEY UPDATE
    col2 = val4
    col3 = cal5;

구문을 보면 ON DUPLICATE KEY (키가 중복일 경우) 라는 문구를 사용함을 알 수 있습니다.
이 뒤에 중복일 경우 어떤 행동을 할지를 넣어주면 되죠.

이 구문은 INSERT 대상인 column들 중 primary key 혹은 unique index가 있고, 입력값 중 primary key나 unique index가 중복되는 경우엔 ON DUPLICATE KEY 다음의 명령어를 실행하게 합니다. 중복되지 않는 경우엔 INSERT ~ VALUES 부분이 실행되고, ON DUPLICATE KEY 다음은 실행되지 않습니다.

따라서 이 방법을 사용할 경우엔 INSERT 대상인 column들 중에 primary key 혹은 unique index가 반드시 포함되어야 한다는 점입니다.

  • INSERT 대상 중 PRIMARY KEY 혹은 UNIQUE INDEX가 있어야 합니다.
  • PK 혹은 UI가 중복될 경우 ON DUPLICATE KEY 다음의 구문이 실행됩니다.

IGNORE 입력 데이터 무시

PRIMARY KEY 혹은 UNIQUE INDEX가 중복일 경우, INSERT 하지 않는 방법입니다.
INSERT IGNORE INTO 구문을 사용합니다.

1
2
INSERT IGNORE INTO tbl_a(col1, col2, col3)
VALUES ('val1', 'val2', 'val3')

이 때에도 INSERT 대상 column들 중에 PRIMARY KEY 혹은 UNIQUE INDEX가 반드시 포함되어야 합니다.

이 구문을 사용하면 중복키값인 데이터를 입력하려고 할 때, 입력을 무시하며 원본 데이터를 유지합니다.

더해, 데이터 입력에 따라 영향을 받는 INCREMENT COLUMN 값은 변화가 없습니다.

REPLACE 데이터 교체

PRIMARY KEY 혹은 UNIQUE INDEX가 중복일 경우, 새로운 값으로 데이터를 대치하는 방법입니다.

앞서 살펴본 IGNORE는 기존 데이터를 유지하지만, REPLACE는 기존 데이터를 지우고 새로 입력하는 값을 넣습니다.

1
2
INSERT REPLACE INTO tbl_a(col1, col2, col3)
VALUES ('val1', 'val2', 'val3')

REPLACE를 할 경우, “기존 데이터를 삭제” 한 뒤 새로 입력하는 것이므로 INCREMENT column은 새로운 번호가 부여됩니다.



Reference

  • mysql merge : https://mohading.tistory.com/22
  • 중복키 대치 : http://jason-heo.github.io/
  • 중복키 대치 : https://reference-m1.tistory.com/400