
5.2 PRIMARY KEY约束
一个表由若干字段构成,其中的一个或一组字段值可以用来唯一标识表中每一行,这样的一个或一组字段称为表的主键,用于实施实体完整性约束。在创建或修改表时,可以通过添加PRIMARY KEY约束来创建主键。
5.2.1 创建表时创建主键
如果主键包含一个字段,则所有记录的该字段值不能相同或为空值;如果主键包含多个字段,则所有记录的该字段值的组合不能相同,而单个字段值可以相同,一个表中只能有一个主键,也就是说只能有一个PRIMARY KEY约束。
注意:数据类型为image和text的字段列不能定义为主键。
创建表时创建主键的方法是在数据列的后面直接添加关键字PRIMARY KEY,并不指明主键约束的名字,这时的主键约束名字由数据库系统自动生成,具体的语法格式如下。

实例1:假如,要在酒店客户管理系统的数据库Hotel中创建一个数据表,用于保存房间信息,并给房间编号添加主键约束,表的字段名和数据类型如表5-1所示。
表5-1 房间信息表

在Hotel数据库中定义数据表Roominfo,为Roomid创建主键约束。在“查询编辑器”窗口中输入以下语句。

单击“执行”按钮,即可完成创建数据表并创建主键的操作,如图5-1所示。执行完成之后,选择新创建的数据表,然后打开该数据表的设计图,即可看到该数据表的结构,其中前面带钥匙标志的列被定义为主键约束,如图5-2所示。

图5-1 执行创建数据表语句

图5-2 表设计界面
5.2.2 修改表时创建主键
数据表创建完成后,如果还需要为数据表创建主键约束,此时不需要再重新创建数据表。我们可以使用ALTER语句或在SQL Server Management Studio中对现有表创建主键。
1. 使用ALTER语句创建主键
使用ALTER语句在现有数据表中创建主键,具体的语法格式如下。
ALTER TABLE table_name ADD CONSTRAINT pk_name PRIMARY KEY (column_name1, column_name2,…)
主要参数介绍如下。
- CONSTRAINT:创建约束的关键字。
- pk_name:设置主键约束的名称。
- PRIMARY KEY:表示所添加约束的类型为主键约束。
实例2:在Hotel数据库中定义数据表Roominfo_01,创建完成之后,在该表中的Roomid字段上创建主键约束,在“查询编辑器”窗口中输入以下语句。

单击“执行”按钮,即可完成创建数据表操作,如图5-3所示。执行完成之后,选择新创建的数据表,然后打开该数据表的设计图,即可看到该数据表的结构,在其中未定义数据表的主键,如图5-4所示。
下面创建数据表的主键,在“查询编辑器”窗口中输入创建主键的语句。
GO ALTER TABLE Roominfo_01 ADD CONSTRAINT 编号 PRIMARY KEY(Roomid)
单击“执行”按钮,即可完成创建主键的操作,如图5-5所示。执行完成之后,选择创建主键的数据表,然后打开该数据表的设计图,即可看到该数据表的结构,其中前面带钥匙标志的列被定义为主键,如图5-6所示。

图5-3 创建数据表Roominfo_01

图5-4 Roominfo_01表设计界面

图5-5 执行创建主键语句
注意:数据表创建完成后,如果需要给某个字段创建主键约束,该字段必须不允许为空,如果为空的话,在创建主键约束时会给出如图5-7所示的错误提示信息。
2. 以图形向导方式创建主键
在SQL Server Management Studio中,可以以图形向导方式创建主键。例如,在Hotel数据库中,对Roominfo数据表中的Roomid创建主键约束,创建过程可以分为如下几步。
(1)登录到SQL Server 2017数据库,在“对象资源管理器”窗口中选择Hotel数据库中的Roominfo表,右击,在弹出的快捷菜单中选择“设计”命令,如图5-8所示。

图5-6 为Roomid列添加主键约束

图5-7 错误提示信息

图5-8 选择“设计”命令
(2)打开表设计窗口,在其中选择Roomid字段对应的行,右击,在弹出的快捷菜单中选择“设置主键”命令,如图5-9所示。
(3)设置完成之后,Roomid所在行会有一个钥匙图标,表示这是主键列,如图5-10所示。

图5-9 选择“设置主键”命令

图5-10 设置“主键”列
5.2.3 创建联合主键约束
在数据表中,可以定义多个字段为联合主键约束,如果对多字段定义了PRIMARY KEY约束,则一列中的值可能会重复,但来自PRIMARY KEY约束定义中所有列的任何值组合必须唯一。
实例3:在Hotel数据库中,定义数据表userinfo,假设表中没有主键id,为了唯一确定一个人员信息,可以把name、tel联合起来作为主键。在“查询编辑器”窗口中输入创建主键的语句。

单击“执行”按钮,即可完成创建数据表的操作,如图5-11所示。执行完成之后,选择新创建的数据表,然后打开该数据表的设计图,即可看到该数据表的结构,其中,name字段和tel字段组合在一起成为userinfo的多字段联合主键,如图5-12所示。
另外,还可以在SQL Server Management Studio中创建多字段联合主键约束,具体的方法为:在“表设计”界面中按Ctrl键选择多行,右击,在弹出的快捷菜单中选择“主键”命令,即可将多列设为主键约束,如图5-13所示。

图5-11 执行创建联合主键语句

图5-12 为表添加联合主键约束

图5-13 设置多列为主键
5.2.4 删除表中的主键
当表中不需要指定PRIMARY KEY约束时,可以使用两种方法将其删除,下面分别进行介绍。
1. 使用DROP语句删除
通过DROP语句删除PRIMARY KEY约束的语法格式如下。
ALTER TABLE table_name DROP CONSTRAINT pk_name
主要参数介绍如下。
- table_name:要去除主键约束的表名。
- pk_name:主键约束的名字。
实例4:在Hotel数据库中,删除Roominfo_01表中定义的主键,在“查询编辑器”窗口中输入以下语句。
ALTER TABLE Roominfo_01 DROP CONSTRAINT 编号
单击“执行”按钮,即可完成删除主键的操作,并在“消息”窗格中显示命令已成功完成的信息提示,如图5-14所示。
执行完成之后,选择删除主键操作的数据表,然后打开该数据表的设计图,即可看到该数据表的结构,其中,Roomid字段主键约束消失,如图5-15所示。
2. 以图形向导方式删除PRIMARY KEY约束
使用SQL Server Management Studio可以以图形向导方式删除主键约束,删除过程可以分为如下几个步骤。
(1)打开数据表userinfo的表结构设计窗口,单击工具栏上的“删除主键”按钮,如图5-16所示。

图5-14 执行删除主键约束SQL语句

图5-15 主键约束被删除

图5-16 单击“删除主键”按钮
(2)表中的主键被删除,如图5-17所示。
另外,通过“索引/键”对话框也可以删除主键,具体操作可以分为如下几步。
(1)打开数据表userinfo的表结构设计窗口,单击工具栏中的“管理索引和键”按钮或者右击,在弹出的快捷菜单中选择“索引/键”命令,如图5-18所示。
(2)打开“索引/键”对话框,选择要删除的索引或键,如图5-19所示。

图5-17 删除表中的多列主键

图5-18 “索引/键”命令

图5-19 “索引/键”对话框
(3)单击“删除”按钮,用户在这里可以选择删除userinfo表中的主键,如图5-20所示。
(4)删除完成之后,单击“关闭”按钮,删除主键操作成功,如图5-21所示。

图5-20 删除主键约束

图5-21 userinfo表结构

微视频