고유 인덱스 만들기Create Unique Indexes

이 항목은 다음에 적용됩니다. 예SQL Server(2016부터)예Azure SQL Database아니요Azure SQL Data Warehouse아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

이 항목에서는 SQL Server 2017SQL Server 2017 또는 SQL Server Management StudioSQL Server Management Studio 을 사용하여 Transact-SQLTransact-SQL에서 테이블에 고유 인덱스를 만드는 방법에 대해 설명합니다.This topic describes how to create a unique index on a table in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL. 고유 인덱스는 인덱스 키에 중복 값을 포함할 수 없으므로 테이블의 모든 행이 고유합니다.A unique index guarantees that the index key contains no duplicate values and therefore every row in the table is in some way unique. UNIQUE 제약 조건을 만드는 것과 제약 조건의 영향을 받지 않는 고유 인덱스를 만드는 것에는 큰 차이가 없습니다.There are no significant differences between creating a UNIQUE constraint and creating a unique index that is independent of a constraint. 데이터 유효성 검사는 이와 동일한 방식으로 수행됩니다. 쿼리 최적화 프로그램에서는 제약 조건에 따라 생성된 고유 인덱스와 수동으로 만든 고유 인덱스를 동일하게 취급합니다.Data validation occurs in the same manner, and the query optimizer does not differentiate between a unique index created by a constraint or manually created. 하지만 열에 UNIQUE 제약 조건을 만들면 인덱스의 목표가 명확해집니다.However, creating a UNIQUE constraint on the column makes the objective of the index clear. UNIQUE 제약 조건에 대한 자세한 내용은 Unique Constraints and Check Constraints을 참조하세요.For more information on UNIQUE constraints, see Unique Constraints and Check Constraints.

고유 인덱스를 만들 때 중복 키를 무시하도록 옵션을 설정할 수 있습니다.When you create a unique index, you can set an option to ignore duplicate keys. 이 옵션을 로 설정하고 INSERT 문을 사용하여 여러 행에 적용되는 데이터 추가 작업을 수행하여 중복 키를 만들려고 하면 중복 키가 포함된 행이 추가되지 않습니다.If this option is set to Yes and you attempt to create duplicate keys by adding data that affects multiple rows (with the INSERT statement), the row containing a duplicate is not added. 이 옵션을 아니요로 설정하면 삽입 작업이 모두 실패하고 데이터 전체가 롤백됩니다.If it is set to No, the entire insert operation fails and all the data is rolled back.

참고

두 개 이상의 행에 NULL이 포함된 열이 있으면 단일 열에 대한 고유 인덱스를 만들 수 없습니다.You cannot create a unique index on a single column if that column contains NULL in more than one row. 마찬가지로, 두 개 이상의 행에 NULL이 포함된 열 조합이 있으면 여러 열에 대한 고유 인덱스를 만들 수 없습니다.Similarly, you cannot create a unique index on multiple columns if the combination of columns contains NULL in more than one row. 이러한 경우는 인덱싱과 관련하여 중복 값으로 취급됩니다.These are treated as duplicate values for indexing purposes.

항목 내용In This Topic

시작하기 전에 Before You Begin

고유 인덱스의 이점 Benefits of a Unique Index

  • 여러 열로 구성된 고유 인덱스를 사용하면 인덱스 키의 각 값 조합이 고유해집니다.Multicolumn unique indexes guarantee that each combination of values in the index key is unique. 예를 들어 LastName, FirstNameMiddleName 열의 조합에 대해 고유 인덱스를 만들면 테이블에 있는 각 행에서 이러한 열의 값 조합이 모두 서로 다릅니다.For example, if a unique index is created on a combination of LastName, FirstName, and MiddleName columns, no two rows in the table could have the same combination of values for these columns.

  • 따라서 각 열의 데이터가 고유하면 같은 테이블에서 하나의 고유 클러스터형 인덱스와 여러 개의 고유 비클러스터형 인덱스를 만들 수 있습니다.Provided that the data in each column is unique, you can create both a unique clustered index and multiple unique nonclustered indexes on the same table.

  • 고유 인덱스를 사용하면 정의된 열의 데이터 무결성이 보장됩니다.Unique indexes ensure the data integrity of the defined columns.

  • 고유 인덱스가 제공하는 유용한 추가 정보를 통해 쿼리 최적화 프로그램은 더 효율적인 실행 계획을 생성할 수 있습니다.Unique indexes provide additional information helpful to the query optimizer that can produce more efficient execution plans.

일반적인 구현 방법 Typical Implementations

고유 인덱스는 다음과 같은 방법으로 구현됩니다.Unique indexes are implemented in the following ways:

  • PRIMARY KEY 또는 UNIQUE 제약 조건PRIMARY KEY or UNIQUE constraint

    PRIMARY KEY 제약 조건을 만들 때 테이블에 클러스터형 인덱스가 없으며 고유 비클러스터형 인덱스를 지정하지 않은 경우 열에 고유 클러스터형 인덱스가 자동으로 생성됩니다.When you create a PRIMARY KEY constraint, a unique clustered index on the column or columns is automatically created if a clustered index on the table does not already exist and you do not specify a unique nonclustered index. 기본 키 열에는 NULL 값이 허용되지 않습니다.The primary key column cannot allow NULL values.

    UNIQUE 제약 조건을 만들면 고유 비클러스터형 인덱스가 생성되어 기본적으로 UNIQUE 제약 조건을 적용합니다.When you create a UNIQUE constraint, a unique nonclustered index is created to enforce a UNIQUE constraint by default. 테이블에 클러스터형 인덱스가 없는 경우 고유 클러스터형 인덱스를 지정할 수 있습니다.You can specify a unique clustered index if a clustered index on the table does not already exist.

    자세한 내용은 Unique Constraints and Check ConstraintsPrimary and Foreign Key Constraints를 참조하세요.For more information, see Unique Constraints and Check Constraints and Primary and Foreign Key Constraints.

  • 제약 조건의 영향을 받지 않는 인덱스Index independent of a constraint

    한 테이블에 고유 비클러스터형 인덱스를 여러 개 정의할 수 있습니다.Multiple unique nonclustered indexes can be defined on a table.

    자세한 내용은 CREATE INDEX(Transact-SQL)를 참조하세요.For more information, see CREATE INDEX (Transact-SQL).

  • 인덱싱된 뷰Indexed view

    인덱싱된 뷰를 만들기 위해 하나 이상의 뷰 열에 고유 클러스터형 인덱스가 정의됩니다.To create an indexed view, a unique clustered index is defined on one or more view columns. 뷰가 실행되고 클러스터형 인덱스에 테이블 데이터가 저장되는 것과 동일한 방법으로 결과 집합이 인덱스의 리프 수준에 저장됩니다.The view is executed and the result set is stored in the leaf level of the index in the same way table data is stored in a clustered index. 자세한 내용은 인덱싱된 뷰 만들기를 참조하세요.For more information, see Create Indexed Views.

제한 사항 Limitations and Restrictions

  • 데이터에 중복된 키 값이 있으면 고유 인덱스, UNIQUE 제약 조건 또는 PRIMARY KEY 제약 조건을 만들 수 없습니다.A unique index, UNIQUE constraint, or PRIMARY KEY constraint cannot be created if duplicate key values exist in the data.

  • 고유 비클러스터형 인덱스에는 키가 아닌 포괄 열이 포함될 수 있습니다.A unique nonclustered index can contain included nonkey columns. 자세한 내용은 Create Indexes with Included Columns을 참조하세요.For more information, see Create Indexes with Included Columns.

보안 Security

사용 권한 Permissions

테이블이나 뷰에 대한 ALTER 권한이 필요합니다.Requires ALTER permission on the table or view. 사용자는 sysadmin 고정 서버 역할의 멤버 또는 db_ddladmindb_owner 고정 데이터베이스 역할의 멤버여야 합니다.User must be a member of the sysadmin fixed server role or the db_ddladmin and db_owner fixed database roles.

SQL Server Management Studio 사용 Using SQL Server Management Studio

테이블 디자이너를 사용하여 고유 인덱스를 만들려면To create a unique index by using the Table Designer

  1. 개체 탐색기에서 고유 인덱스를 만들 테이블이 포함된 데이터베이스를 확장합니다.In Object Explorer, expand the database that contains the table on which you want to create a unique index.

  2. 테이블 폴더를 확장합니다.Expand the Tables folder.

  3. 고유 인덱스를 만들 테이블을 마우스 오른쪽 단추로 클릭하고 디자인을 선택합니다.Right-click the table on which you want to create a unique index and select Design.

  4. 테이블 디자이너 메뉴에서 인덱스/키를 선택합니다.On the Table Designer menu, select Indexes/Keys.

  5. 인덱스/키 대화 상자에서 추가를 클릭합니다.In the Indexes/Keys dialog box, click Add.

  6. 선택한 기본/고유 키 또는 인덱스 입력란에서 새 인덱스를 선택합니다.Select the new index in the Selected Primary/Unique Key or Index text box.

  7. 주 표의 (일반)에서 유형 을 선택한 다음 목록에서 인덱스 를 선택합니다.In the main grid, under (General), select Type and then choose Index from the list.

  8. 을 선택한 다음 줄임표 (…)를 클릭합니다.Select Columns, and then click the ellipsis (…).

  9. 인덱스 열 대화 상자의 열 이름에서 인덱스를 작성할 열을 선택합니다.In the Index Columns dialog box, under Column Name, select the columns you want to index. 최대 16개의 열을 선택할 수 있습니다.You can select up to 16 columns. 최상의 성능을 얻으려면 인덱스별로 열을 한두 개만 선택하는 것이 좋습니다.For optimal performance, select only one or two columns per index. 선택한 각 열에 대해 해당 열의 인덱스 값을 오름차순으로 정렬할지 내림차순으로 정렬할지 지정합니다.For each column you select, indicate whether the index arranges values of this column in ascending or descending order.

  10. 인덱스의 모든 열을 선택한 후 확인을 클릭합니다.When all columns for the index are selected, click OK.

  11. 표의 (일반)에서 고유 여부 를 선택한 다음 목록에서 를 선택합니다.In the grid, under (General), select Is Unique and then choose Yes from the list.

  12. 선택 사항: 주 표의 테이블 디자이너에서 중복 키 무시 를 선택한 다음 목록에서 를 선택합니다.Optional: In the main grid, under Table Designer, select Ignore Duplicate Keys and then choose Yes from the list. 고유 인덱스에 중복 키를 만드는 데이터를 추가하려는 시도를 무시하려는 경우 이와 같이 선택합니다.Do this if you want to ignore attempts to add data that would create a duplicate key in the unique index.

  13. 닫기를 클릭합니다.Click Close.

  14. 파일 메뉴에서 table name 저장을 클릭합니다.On the File menu, click Savetable_name.

개체 탐색기를 사용하여 고유 인덱스 만들기Create a unique index by using Object Explorer

  1. 개체 탐색기에서 고유 인덱스를 만들 테이블이 포함된 데이터베이스를 확장합니다.In Object Explorer, expand the database that contains the table on which you want to create a unique index.

  2. 테이블 폴더를 확장합니다.Expand the Tables folder.

  3. 고유 인덱스를 만들 테이블을 확장합니다.Expand the table on which you want to create a unique index.

  4. 인덱스 폴더를 마우스 오른쪽 단추로 클릭하고 새 인덱스를 가리킨 다음 비클러스터형 인덱스...를 선택합니다.Right-click the Indexes folder, point to New Index, and select Non-Clustered Index….

  5. 새 인덱스 대화 상자의 일반 페이지에서 인덱스 이름 상자에 새 인덱스의 이름을 입력합니다.In the New Index dialog box, on the General page, enter the name of the new index in the Index name box.

  6. 고유 확인란을 선택합니다.Select the Unique check box.

  7. 인덱스 키 열아래에서 추가...를 클릭합니다.Under Index key columns, click Add….

  8. table_name에서 열 선택 대화 상자에서 고유 인덱스에 추가할 테이블 열의 확인란을 선택합니다.In the Select Columns fromtable_name dialog box, select the check box or check boxes of the table column or columns to be added to the unique index.

  9. 확인을 클릭합니다.Click OK.

  10. 새 인덱스 대화 상자에서 확인을 클릭합니다.In the New Index dialog box, click OK.

Transact-SQL 사용 Using Transact-SQL

테이블에 고유 인덱스를 만들려면To create a unique index on a table

  1. 개체 탐색기에서 데이터베이스 엔진Database Engine인스턴스에 연결합니다.In Object Explorer, connect to an instance of 데이터베이스 엔진Database Engine.

  2. 표준 도구 모음에서 새 쿼리를 클릭합니다.On the Standard bar, click New Query.

  3. 다음 예를 복사하여 쿼리 창에 붙여 넣고 실행을 클릭합니다.Copy and paste the following example into the query window and click Execute.

    USE AdventureWorks2012;  
    GO  
    -- Find an existing index named AK_UnitMeasure_Name and delete it if found  
    IF EXISTS (SELECT name from sys.indexes  
               WHERE name = N'AK_UnitMeasure_Name')   
       DROP INDEX AK_UnitMeasure_Name ON Production.UnitMeasure;   
    GO  
    -- Create a unique index called AK_UnitMeasure_Name  
    -- on the Production.UnitMeasure table using the Name column.  
    CREATE UNIQUE INDEX AK_UnitMeasure_Name   
       ON Production.UnitMeasure (Name);   
    GO  
    

    자세한 내용은 CREATE INDEX(Transact-SQL)를 참조하세요.For more information, see CREATE INDEX (Transact-SQL).