创建主键

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

可以使用 SQL Server Management Studio 或 Transact-SQL 在 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”

在现有表中创建主键

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

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

在新表中创建主键

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

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

在新表中创建具有聚集索引的主键

下面的示例创建一个表,并对 AdventureWorks 数据库中的 CustomerID 列和 TransactionID 分别定义主键和聚集索引。

-- Create table to add the clustered index
CREATE TABLE Production.TransactionHistoryArchive1
   (
      CustomerID uniqueidentifier DEFAULT NEWSEQUENTIALID()
      , TransactionID int IDENTITY (1,1) NOT NULL
      , CONSTRAINT PK_TransactionHistoryArchive1_CustomerID PRIMARY KEY NONCLUSTERED (CustomerID)
   )
;

-- Now add the clustered index
CREATE CLUSTERED INDEX CIX_TransactionID ON Production.TransactionHistoryArchive1 (TransactionID);

后续步骤