기본 키 만들기

적용 대상: SQL Server 2016(13.x) 이상 Azure SQL 데이터베이스Azure SQL Managed Instance

SQL Server Management Studio 또는 Transact-SQL을 사용하여 SQL Server 데이터베이스 엔진에서 기본 키를 정의할 수 있습니다. 기본 키를 만들면 해당 고유 클러스터형 인덱스가 자동으로 생성됩니다. 그러나 기본 키를 비클러스터형 인덱스로 대신 지정할 수 있습니다.

이 글은 AdventureWorks2022샘플 데이터터베이스를 필요로 하며, 이는 Microsoft SQL Server 예제 및 커뮤니티 프로젝트(Microsoft SQL Server Samples and Community Projects) 홈 페이지에서 다운로드할 수 있습니다.

제한 사항

테이블에는 하나의 PRIMARY KEY 제약 조건만 포함할 수 있습니다.

PRIMARY KEY 제약 조건 내에서 정의된 모든 열은 NOT NULL로 정의되어야 합니다. Null 허용 여부를 지정하지 않은 경우 PRIMARY KEY 제약 조건에 참여하는 모든 열의 Null 허용 여부가 NOT NULL으로 설정됩니다.

사용 권한

기본 키가 포함된 새 테이블을 만들려면 데이터베이스에 CREATE TABLE 권한이 필요하고 테이블을 만들려는 스키마에 대한 ALTER 권한이 필요합니다.

기존 테이블에서 기본 키를 만들려면 테이블에 대한 ALTER 권한이 필요합니다.

SQL Server Management Studio 사용

  1. 개체 탐색기에서 고유성 제약 조건을 추가하려는 테이블을 마우스 오른쪽 단추로 클릭하고 디자인을 선택합니다.
  2. 테이블 디자이너에서 기본 키로 정의할 데이터베이스 열의 행 선택기를 선택합니다. 열을 여러 개 선택하려면 Ctrl 키를 누른 채 다른 열의 행 선택기를 선택합니다.
  3. 열의 행 선택기를 마우스 오른쪽 단추로 클릭하고 기본 키 설정을 선택합니다.

주의

기본 키를 다시 정의하려면 새 기본 키를 만들기 전에 기존 기본 키에 대한 모든 관계를 삭제해야 합니다. 이 프로세스의 일부로 기존 관계가 자동으로 삭제된다는 경고 메시지가 표시됩니다.

기본 키 열은 행 선택기의 기본 키 기호로 식별됩니다.

기본 키가 열 2개 이상으로 구성된 경우 중복 값은 열 하나에 허용되지만 기본 키에 있는 모든 열의 각 값 조합은 고유해야 합니다.

복합 키를 정의하는 경우 기본 키의 열 순서는 테이블에 표시된 열 순서와 일치합니다. 그러나 기본 키를 만든 후에 열 순서를 변경할 수 있습니다. 자세한 내용은 기본 키 수정을 참조하세요.

Transact-SQL 사용

기존 테이블에 기본 키 만들기

다음 예제에서는 AdventureWorks2022 데이터베이스의 TransactionID 열에 기본 키를 만듭니다.

ALTER TABLE [Production].[TransactionHistoryArchive]
   ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID);

새 테이블에 기본 키 만들기

다음 예제에서는 AdventureWorks2022 데이터베이스의 TransactionID 열에 테이블을 만들고 기본 키를 정의합니다.

CREATE TABLE [Production].[TransactionHistoryArchive1] (
    TransactionID INT IDENTITY(1, 1) NOT NULL,
    CONSTRAINT PK_TransactionHistoryArchive1_TransactionID PRIMARY KEY CLUSTERED (TransactionID)
);

개별 클러스터형 인덱스를 사용하여 새 테이블에 비클러스터형 기본 키 만들기

다음 예제에서는 AdventureWorks2022 데이터베이스에 CustomerID 열에 비클러스터형 기본 키가 있는 테이블을 만듭니다. 그런 다음 TransactionID에 클러스터형 인덱스를 추가합니다.

  1. 클러스터형 인덱스를 추가할 테이블을 만듭니다.

    CREATE TABLE [Production].[TransactionHistoryArchive1] (
        CustomerID UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(),
        TransactionID INT IDENTITY(1, 1) NOT NULL,
        CONSTRAINT PK_TransactionHistoryArchive1_CustomerID PRIMARY KEY NONCLUSTERED (CustomerID)
    );
    
  2. 이제 클러스터형 인덱스를 추가합니다.

    CREATE CLUSTERED INDEX CIX_TransactionID
    ON [Production].[TransactionHistoryArchive1] (TransactionID);