创建主键
适用于:SQL Server 2016 (13.x) 及更高版本 Azure SQL 数据库 Azure SQL 托管实例
可以使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 数据库引擎中定义主键。 创建主键将自动创建相应的唯一聚集索引。 但是,可以将主键指定为非聚集索引。
本文中的 Transact-SQL 代码示例使用 AdventureWorks2022
或 AdventureWorksDW2022
示例数据库,可从 Microsoft SQL Server 示例和社区项目主页下载它。
限制
一个表只能包含一个 PRIMARY KEY
约束。
在 PRIMARY KEY
约束中定义的所有列都必须定义为 NOT NULL
。 如果没有指定为 Null 性,则加入 PRIMARY KEY
约束的所有列的为 Null 性都设置为 NOT NULL
。
权限
使用主键创建新表需要在数据库中具有 CREATE TABLE
权限,并对在其中创建表的架构具有 ALTER
权限。
在现有表中创建主键需要对该表具有 ALTER
权限。
使用 SQL Server Management Studio
- 在对象资源管理器中,右键单击要为其添加唯一约束的表,然后选择“设计”。
- 在“表设计器”中,选择要定义为主键的数据库列的行选择器。 若要选择多个列,请在选择其他列的行选择器时按住 Ctrl 键。
- 右键单击该列的行选择器,然后选择“设置主键”。
注意
若要重新定义主键,则必须首先删除与现有主键之间的任何关系,然后才能创建新主键。 此时,将显示一条消息警告您:作为该过程的一部分,将自动删除现有关系。
主键列由其行选择器中的主键符号标识。
如果主键由多个列组成,则其中一个列将允许重复值,但是主键中所有列的值的各种组合必须是唯一的。
如果定义复合键,则主键中列的顺序将与表中显示的列顺序相匹配。 不过,您可以在创建主键之后更改列的顺序。 有关详细信息,请参阅 修改主键。
使用 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);