기본 키 만들기
적용 대상: SQL Server 2016(13.x) 이상 Azure SQL 데이터베이스 Azure SQL Managed Instance
SQL Server Management Studio 또는 Transact-SQL을 사용하여 SQL Server 데이터베이스 엔진에서 기본 키를 정의할 수 있습니다. 기본 키를 만들면 해당 고유 클러스터형 인덱스가 자동으로 생성됩니다. 그러나 기본 키를 비클러스터형 인덱스로 대신 지정할 수 있습니다.
이 문서의 Transact-SQL 코드 샘플은 AdventureWorks2022
또는 AdventureWorksDW2022
샘플 데이터베이스를 사용하며, 이는 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 사용
- 개체 탐색기에서 고유성 제약 조건을 추가하려는 테이블을 마우스 오른쪽 단추로 클릭하고 디자인을 선택합니다.
- 테이블 디자이너에서 기본 키로 정의할 데이터베이스 열의 행 선택기를 선택합니다. 열을 여러 개 선택하려면 Ctrl 키를 누른 채 다른 열의 행 선택기를 선택합니다.
- 열의 행 선택기를 마우스 오른쪽 단추로 클릭하고 기본 키 설정을 선택합니다.
주의
기본 키를 다시 정의하려면 새 기본 키를 만들기 전에 기존 기본 키에 대한 모든 관계를 삭제해야 합니다. 이 프로세스의 일부로 기존 관계가 자동으로 삭제된다는 경고 메시지가 표시됩니다.
기본 키 열은 행 선택기의 기본 키 기호로 식별됩니다.
기본 키가 열 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
에 클러스터형 인덱스를 추가합니다.
클러스터형 인덱스를 추가할 테이블을 만듭니다.
CREATE TABLE [Production].[TransactionHistoryArchive1] ( CustomerID UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(), TransactionID INT IDENTITY(1, 1) NOT NULL, CONSTRAINT PK_TransactionHistoryArchive1_CustomerID PRIMARY KEY NONCLUSTERED (CustomerID) );
이제 클러스터형 인덱스를 추가합니다.
CREATE CLUSTERED INDEX CIX_TransactionID ON [Production].[TransactionHistoryArchive1] (TransactionID);