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

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

本文中的代码示例使用 AdventureWorks2022 AdventureWorksDW2022 示例数据库,可以从 Microsoft SQL Server 示例和社区项目 主页下载该数据库。

Limitations

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

PRIMARY KEY 约束中定义的所有列都必须定义为 NOT NULL 。 如果未指定可空性,则参与 PRIMARY KEY 约束的所有列的可空性都设置为 NOT NULL

Permissions

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

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

使用 SQL Server Management Studio

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

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

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

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

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

    Use 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 上添加聚集索引。

  • 创建一个表以添加聚集索引。

    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);
    
                  ALTER TABLE (Transact-SQL)
  • CREATE TABLE (Transact-SQL)
  • ALTER TABLE table_constraint(Transact-SQL)