고유 인덱스
고유 인덱스 (Unique Index)
한 열의 값이, 또는 여러 열을 합친 값이 테이블 안에서 유일해야 한다면 어떻게 보장할 수 있을까요? 그럴 때 쓰는 게 고유 인덱스(unique index) 에요. 고유 인덱스를 걸면 같은 값을 가진 행이 두 개 이상 들어오는 걸 막을 수 있는데요, 지금은 B-tree 인덱스만 고유하게 선언할 수 있어요. 이번에는 고유 인덱스가 어떤 규칙으로 동작하고, 유니크 제약이나 기본 키와 어떤 관계가 있는지 정리해 볼게요.
고유 인덱스 만들기
고유 인덱스는 열 하나의 값 유일성뿐 아니라, 여러 열을 합친 값의 유일성도 강제할 수 있어요. 기본 문법은 이렇게 생겼어요.
CREATE UNIQUE INDEX name ON table (column [, ...]) [ NULLS [ NOT ] DISTINCT ];
인덱스가 고유하게 선언되면, 인덱스된 값을 가진 테이블 행이 여러 개 있으면 안 돼요. 흥미로운 점은 기본적으로 고유 열의 NULL 값은 서로 같다고 보지 않는다는 거예요. 그래서 같은 열에 NULL이 여러 개 있어도 허용되는 거죠. NULLS NOT DISTINCT 옵션을 주면 그때부터 인덱스가 NULL을 서로 같다고 취급해요. 다중 열 고유 인덱스는 모든 인덱스 열이 여러 행에서 동시에 같을 때만 거부돼요.
유니크 제약·기본 키와의 관계
PostgreSQL은 테이블에 유니크 제약(unique constraint)이나 기본 키(primary key)를 정의할 때 자동으로 고유 인덱스를 만들어줘요. 이 인덱스는 기본 키 또는 유니크 제약을 구성하는 열들을 덮고(필요하면 다중 열 인덱스), 그 제약을 강제하는 메커니즘이 돼요.
고유 열에는 인덱스를 수동으로 만들 필요가 없어요. 자동으로 만들어진 인덱스를 그대로 중복해서 만드는 꼴이라, 굳이 그럴 이유가 없거든요.
더 알아보기
- 인덱스 개요 — 인덱스 기본 개념
- 부분 인덱스 — 일부 행에만 고유성 제약을 거는 방법
- 기본 키와 유니크 제약 — DDL에서 제약을 선언하는 법