본문 바로가기

전체보기/Database

[MySql] Multiple-column Unique index 사용하기

intro

최근 회사에서 multiple-column unique index 사용할 일이 있었는데,
그 과정에서 알게된 사실들을 간단하게 정리해보려고 합니다.

 

우선 unique index를 사용이 필요한 상황을 간단하게 예시로 설명해보겠습니다.

아래와 같이 사용자의 정보를 정의한 테이블 있다고 가정해보겠습니다.

 

name address
철수 서울
영희 경기도
영수 NULL

 

저희 서비스의 설계에서는 이름과 주소(address)의 조합이 unique할 필요가 있었고
동시에 주소 자체는 NULL과 중복을 허용할 필요가 있었습니다.

 

예를 들어, 위의 테이블에서
(철수, 경기도) 데이터는 철수가 겹치기 때문에 데이터가 적재되어서는 안되지만,
(철희, 서울)은 이름/이름과 주소의 조합이 모두 unique하기 때문에 적재될 수 있어야 했습니다.

problem

처음에는 단순하게 두 컬럼을 unique index로 묶으면 문제가 해결될 것으로 기대했습니다.

하지만 기대와 다르게 아래와 같이 이름이 중복되고 주소가 NULL일 경우에도 데이터가 적재되는 문제가 있었습니다.

name address
철수 NULL
철수 NULL

 

원인이 되는 부문은 역시나 NULL 값이었습니다.

잠깐 아래 쿼리를 살펴보겠습니다.

 

SELECT IF(NULL != NULL, 'true', 'false');
SELECT IF(NULL = NULL, 'true', 'false');

 

NULL 값이 같은 값이라면 true를, 다르다면 false를 반환하는 간단한 쿼리입니다.
(실제로 위와 같이 사용하시면 안됩니다.)

위 쿼리의 결과는 무엇일까요?

 

 

 

 

 

 

결과는 모두 false가 나오게 됩니다.

 

이처럼 NULL이라는 값은 비교가 불가능한 값이기 때문에 주소값에 NULL을 허용할 경우,
(참고로, NULLNULL이 아닌 다른값을 비교할 경우, 결과는 NULL이 나옵니다.)

 

이름과 조합을 unique index로 거는 것만으로는 문제를 해결할 수 없었습니다.

solution

위 문제의 해결 방안으로는 크게 두 가지를 생각하였습니다.

  1. 이름만을 가지는 unique index를 추가한다.
  2. 주소에 default 값으로 빈 문자열이 들어가도록 설정한다.

(혹시나 그 외에 좋은 방법이 있다면 댓글 부탁드립니다.)

여기까지 multi-column unique index를 사용하면서 알게된 내용을 정리해봤습니다.

반응형