创建主键

适用于: SQL Server 2016 (13.x) 及更高版本 Azure SQL 数据库Azure SQL 托管实例

可以使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 数据库引擎中定义主键。 创建主键将自动创建相应的唯一聚集索引。 但是,可以将主键指定为非聚集索引。

本文要求使用 AdventureWorks2022 示例数据库,你可从 Microsoft SQL Server 示例和社区项目主页下载。

限制

一个表只能包含一个 PRIMARY KEY 约束。

PRIMARY KEY 约束中定义的所有列都必须定义为 NOT NULL。 如果没有指定为 Null 性,则加入 PRIMARY KEY 约束的所有列的为 Null 性都设置为 NOT NULL

权限

使用主键创建新表需要在数据库中具有 CREATE TABLE 权限,并对在其中创建表的架构具有 ALTER 权限。

在现有表中创建主键需要对该表具有 ALTER 权限。

使用 SQL Server Management Studio

  1. 在对象资源管理器中,右键单击要为其添加唯一约束的表,然后选择“设计”。
  2. 在“表设计器”中,选择要定义为主键的数据库列的行选择器。 若要选择多个列,请在选择其他列的行选择器时按住 Ctrl 键。
  3. 右键单击该列的行选择器,然后选择“设置主键”

注意

若要重新定义主键,则必须首先删除与现有主键之间的任何关系,然后才能创建新主键。 此时,将显示一条消息警告您:作为该过程的一部分,将自动删除现有关系。

主键列由其行选择器中的主键符号标识。

如果主键由多个列组成,则其中一个列将允许重复值,但是主键中所有列的值的各种组合必须是唯一的。

如果定义复合键,则主键中列的顺序将与表中显示的列顺序相匹配。 不过,您可以在创建主键之后更改列的顺序。 有关详细信息,请参阅 修改主键

使用 Transact-SQL

在现有表中创建主键

下面的示例对 TransactionID 数据库中的 AdventureWorks2022 列创建主键。

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

在新表中创建主键

下面的示例创建一个表,并对 TransactionID 数据库中的 AdventureWorks2022 列定义主键。

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);