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을 허용할 경우,
(참고로, NULL과 NULL이 아닌 다른값을 비교할 경우, 결과는 NULL이 나옵니다.)
이름과 조합을 unique index로 거는 것만으로는 문제를 해결할 수 없었습니다.
solution
위 문제의 해결 방안으로는 크게 두 가지를 생각하였습니다.
- 이름만을 가지는 unique index를 추가한다.
- 주소에 default 값으로 빈 문자열이 들어가도록 설정한다.
(혹시나 그 외에 좋은 방법이 있다면 댓글 부탁드립니다.)
여기까지 multi-column unique index를 사용하면서 알게된 내용을 정리해봤습니다.
'전체보기 > Database' 카테고리의 다른 글
| [MySQL]Index 파헤치기 - multi-column index range scan(수정) (0) | 2021.07.28 |
|---|---|
| [MSSQL] DECIMAL 사칙연산 파헤치기 (0) | 2020.10.15 |
| [MSSQL] Collation 충돌 해결하기 (0) | 2020.06.13 |
| [MSSQL] Collation 파헤치기 (1) | 2020.06.12 |
| [Database]Isolation level 파헤치기 - 서로 다른 isolation level을 가진 transaction들은 어떻게 동작할까? (0) | 2020.03.01 |