고유 인덱스 만들기

고유 인덱스를 만들면 키 값이 중복되지 않습니다. UNIQUE 제약 조건을 만드는 것과 제약 조건의 영향을 받지 않는 고유 인덱스를 만드는 것에는 큰 차이가 없습니다. 데이터 유효성 검사는 이와 동일한 방식으로 수행됩니다. 쿼리 최적화 프로그램에서는 제약 조건에 따라 생성된 고유 인덱스와 수동으로 만든 고유 인덱스를 동일하게 취급합니다. 그러나 데이터 무결성을 유지하는 것이 중요한 경우에는 열에 UNIQUE 제약 조건을 만들어야 합니다. 이렇게 하면 인덱스의 용도가 분명해집니다.

일반적인 구현 방법

고유 인덱스는 다음과 같은 방법으로 구현됩니다.

  • PRIMARY KEY 또는 UNIQUE 제약 조건

    PRIMARY KEY 제약 조건을 만들 때 테이블에 클러스터형 인덱스가 없으며 고유 비클러스터형 인덱스를 지정하지 않은 경우 열에 고유 클러스터형 인덱스가 자동으로 생성됩니다. 기본 키 열에는 NULL 값이 허용되지 않습니다.

    UNIQUE 제약 조건을 만들면 고유 비클러스터형 인덱스가 생성되어 기본적으로 UNIQUE 제약 조건을 적용합니다. 테이블에 클러스터형 인덱스가 없는 경우 고유 클러스터형 인덱스를 지정할 수 있습니다.

    자세한 내용은 PRIMARY KEY 제약 조건UNIQUE 제약 조건을 참조하십시오.

  • 제약 조건의 영향을 받지 않는 인덱스

    한 테이블에 고유 비클러스터형 인덱스를 여러 개 정의할 수 있습니다.

    자세한 내용은 CREATE INDEX(Transact-SQL)를 참조하십시오.

  • 인덱싱된 뷰

    인덱싱된 뷰를 만들기 위해 하나 이상의 뷰 열에 고유 클러스터형 인덱스가 정의됩니다. 뷰가 실행되고(구체화되고) 클러스터형 인덱스에 테이블 데이터가 저장되는 것과 동일한 방법으로 결과 집합이 인덱스의 리프 수준에서 저장됩니다. 자세한 내용은 인덱싱된 뷰 만들기를 참조하십시오.

중복 값 문제 해결

키 열에 중복 값이 있으면 고유 인덱스나 제약 조건을 만들 수 없습니다. 예를 들어 FirstNameLastName 열에 고유 복합 인덱스를 만들려는 경우 테이블의 FirstNameLastName열에 **'Jane'**값과 'Smith' 값이 포함된 두 개의 행이 있으면 고유 인덱스를 만들 수 없습니다. 다음과 같은 방법으로 이 문제를 해결할 수 있습니다.

  • 인덱스 정의에서 열을 추가하거나 제거하여 고유 복합 인덱스를 만듭니다. 앞의 예에서는 인덱스 정의에 MiddleName 열을 추가하여 중복 문제를 해결할 수 있습니다.

  • 중복 값이 데이터 입력 오류로 인한 것이면 데이터를 직접 수정한 다음 인덱스나 제약 조건을 만듭니다.

IGNORE_DUP_KEY 옵션을 사용한 중복 값 처리

고유 인덱스 또는 제약 조건을 만들거나 수정할 때 IGNORE_DUP_KEY 옵션을 ON 또는 OFF로 설정할 수 있습니다. 이 옵션은 삽입 작업에서 고유 인덱스에 중복된 키 값을 삽입하려는 경우에 대한 오류 응답을 지정합니다. IGNORE_DUP_KEY 옵션은 인덱스가 생성되거나 다시 작성된 후에 수행되는 작업을 삽입하는 데만 적용됩니다. CREATE INDEX, ALTER INDEX 또는 UPDATE를 실행하는 경우에는 옵션이 아무런 영향을 미치지 않습니다. 기본값은 OFF입니다.

  • ON
    중복된 키 값이 고유 인덱스에 삽입되는 경우 경고 메시지가 나타나고 고유성 제약 조건을 위반하는 행만 실패합니다.

  • OFF
    중복된 키 값이 고유 인덱스에 삽입되는 경우 오류 메시지가 나타나고 전체 INSERT 작업이 롤백됩니다.

예를 들어 하나의 문이 고유 인덱스가 있는 테이블에 20개의 행을 삽입할 때 10개의 행에 중복 키 값이 있으면 기본적으로 20개의 행이 모두 거부됩니다. 그러나 이 IGNORE_DUP_KEY 인덱스 옵션이 ON이면 중복되는 10개의 키 값만 거부되고 중복되지 않는 나머지 10개의 키 값은 테이블에 삽입됩니다.

뷰, 고유하지 않은 인덱스, XML 인덱스, 공간 인덱스 및 필터링된 인덱스에 생성된 인덱스의 경우 IGNORE_DUP_KEY를 ON으로 설정할 수 없습니다.

IGNORE_DUP_KEY를 보려면 sys.indexes를 사용하십시오.

이전 버전과 호환되는 구문에서 WITH IGNORE_DUP_KEY는 WITH IGNORE_DUP_KEY = ON과 같습니다.

NULL 값 처리

인덱싱 작업에서 NULL 값은 동일한 값으로 간주됩니다. 따라서 둘 이상의 행에서 키 값이 NULL인 경우에는 고유 인덱스 또는 UNIQUE 제약 조건을 만들 수 없습니다. 고유 인덱스 또는 UNIQUE 제약 조건을 만들 열을 선택할 때는 NOT NULL로 정의된 열을 선택합니다.

디스크 공간 요구 사항

고유 인덱스의 디스크 공간 요구 사항을 결정하는 작업은 클러스터형 인덱스 및 비클러스터형 인덱스의 디스크 공간 요구 사항을 결정하는 작업과 같습니다. 인덱스의 디스크 공간 요구 사항에 대한 자세한 내용은 인덱스 디스크 공간 요구 사항 확인을 참조하십시오.

테이블을 만들 때 인덱스를 만들려면

기존 테이블에 인덱스를 만들려면