适用于:

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