![SQL Server 入门很轻松(微课超值版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/402/32858402/b_32858402.jpg)
5.2 PRIMARY KEY约束
一个表由若干字段构成,其中的一个或一组字段值可以用来唯一标识表中每一行,这样的一个或一组字段称为表的主键,用于实施实体完整性约束。在创建或修改表时,可以通过添加PRIMARY KEY约束来创建主键。
5.2.1 创建表时创建主键
如果主键包含一个字段,则所有记录的该字段值不能相同或为空值;如果主键包含多个字段,则所有记录的该字段值的组合不能相同,而单个字段值可以相同,一个表中只能有一个主键,也就是说只能有一个PRIMARY KEY约束。
注意:数据类型为image和text的字段列不能定义为主键。
创建表时创建主键的方法是在数据列的后面直接添加关键字PRIMARY KEY,并不指明主键约束的名字,这时的主键约束名字由数据库系统自动生成,具体的语法格式如下。
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P92_23513.jpg?sign=1739321942-z6ULos3S3NllZ3tzivkQICJrJ6JzoDqb-0-83db863948c83fbcaad47b98c81d2cb2)
实例1:假如,要在酒店客户管理系统的数据库Hotel中创建一个数据表,用于保存房间信息,并给房间编号添加主键约束,表的字段名和数据类型如表5-1所示。
表5-1 房间信息表
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-T92_23514.jpg?sign=1739321942-h83iLiIztNnXfZ6cgCvnAWi5N5mqqXRK-0-47eb7b48cebfcf09b13f9e02b3963f20)
在Hotel数据库中定义数据表Roominfo,为Roomid创建主键约束。在“查询编辑器”窗口中输入以下语句。
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P92_23515.jpg?sign=1739321942-jynnJPGeMBLSVxr5hTfVaBHf387elwcy-0-ec8e3c3042fabe8cabc0e7864324cee0)
单击“执行”按钮,即可完成创建数据表并创建主键的操作,如图5-1所示。执行完成之后,选择新创建的数据表,然后打开该数据表的设计图,即可看到该数据表的结构,其中前面带钥匙标志的列被定义为主键约束,如图5-2所示。
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P93_6278.jpg?sign=1739321942-5k0lKPhFl4iKwD32qi08l89R2c7YjZa3-0-a7132da8829c4a26961818276eeef0d7)
图5-1 执行创建数据表语句
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P93_6279.jpg?sign=1739321942-5L9Q5ZTNIxQtYrEz9v7Way4WVPzSm4Nd-0-aa69452ca90b4eea91cd0399e1fe6402)
图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字段上创建主键约束,在“查询编辑器”窗口中输入以下语句。
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P93_23509.jpg?sign=1739321942-ohTfaw97FmKcXDvHM6NrTs9GTTROcWlP-0-f6c304534adad15163aa1e16e7d036e5)
单击“执行”按钮,即可完成创建数据表操作,如图5-3所示。执行完成之后,选择新创建的数据表,然后打开该数据表的设计图,即可看到该数据表的结构,在其中未定义数据表的主键,如图5-4所示。
下面创建数据表的主键,在“查询编辑器”窗口中输入创建主键的语句。
GO ALTER TABLE Roominfo_01 ADD CONSTRAINT 编号 PRIMARY KEY(Roomid)
单击“执行”按钮,即可完成创建主键的操作,如图5-5所示。执行完成之后,选择创建主键的数据表,然后打开该数据表的设计图,即可看到该数据表的结构,其中前面带钥匙标志的列被定义为主键,如图5-6所示。
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P94_6385.jpg?sign=1739321942-Rdny1lPDJElMgivAM8DKYEBQGlRO1E83-0-3be2ed341997ca72ac670a21bcb3909e)
图5-3 创建数据表Roominfo_01
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P94_6386.jpg?sign=1739321942-9jnsFNbPAvXDWnVemAzIACnLz0b9DcQa-0-13e9e9a6a4aec50f277283b9084d8623)
图5-4 Roominfo_01表设计界面
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P94_6387.jpg?sign=1739321942-JD2HMeTA09StWO4rEzcmlYANRwmLIOmy-0-538541940ee9bda0d9242ce61386608d)
图5-5 执行创建主键语句
注意:数据表创建完成后,如果需要给某个字段创建主键约束,该字段必须不允许为空,如果为空的话,在创建主键约束时会给出如图5-7所示的错误提示信息。
2. 以图形向导方式创建主键
在SQL Server Management Studio中,可以以图形向导方式创建主键。例如,在Hotel数据库中,对Roominfo数据表中的Roomid创建主键约束,创建过程可以分为如下几步。
(1)登录到SQL Server 2017数据库,在“对象资源管理器”窗口中选择Hotel数据库中的Roominfo表,右击,在弹出的快捷菜单中选择“设计”命令,如图5-8所示。
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P94_6392.jpg?sign=1739321942-bfw8HikbyZGjMExh9ZHnHTNoIWknzzCC-0-12315c096661643d3858ab44d00088a6)
图5-6 为Roomid列添加主键约束
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P94_6393.jpg?sign=1739321942-Chmia0OeGh2lQhnk82iVo2u7OZz1fM3n-0-10aa0d6011f17443459cf6c6183a026f)
图5-7 错误提示信息
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P94_6394.jpg?sign=1739321942-8L4HDHTod0n4DX1m5WNnmZSGvFOSwTB9-0-4e1da7f4d3e8d2f5bf226f6e8019fc1d)
图5-8 选择“设计”命令
(2)打开表设计窗口,在其中选择Roomid字段对应的行,右击,在弹出的快捷菜单中选择“设置主键”命令,如图5-9所示。
(3)设置完成之后,Roomid所在行会有一个钥匙图标,表示这是主键列,如图5-10所示。
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P94_6398.jpg?sign=1739321942-GFjBua8MNa8mgsEOgI11Sk05QUduc0VS-0-f7296793b697bbdcbfa65e4dd11f3d67)
图5-9 选择“设置主键”命令
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P94_6399.jpg?sign=1739321942-OlQ5MB5KykdPHNCT1Vq9gtwUmHhu8pFE-0-6f4a63f07015f6f7ca64e6f15cd0d716)
图5-10 设置“主键”列
5.2.3 创建联合主键约束
在数据表中,可以定义多个字段为联合主键约束,如果对多字段定义了PRIMARY KEY约束,则一列中的值可能会重复,但来自PRIMARY KEY约束定义中所有列的任何值组合必须唯一。
实例3:在Hotel数据库中,定义数据表userinfo,假设表中没有主键id,为了唯一确定一个人员信息,可以把name、tel联合起来作为主键。在“查询编辑器”窗口中输入创建主键的语句。
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P95_23489.jpg?sign=1739321942-HPH8Z7UJW1XG4Oo6HmGeBfmEYiuiRfpJ-0-1c9dd608d4bd2ae1510a9e56bf75b8b2)
单击“执行”按钮,即可完成创建数据表的操作,如图5-11所示。执行完成之后,选择新创建的数据表,然后打开该数据表的设计图,即可看到该数据表的结构,其中,name字段和tel字段组合在一起成为userinfo的多字段联合主键,如图5-12所示。
另外,还可以在SQL Server Management Studio中创建多字段联合主键约束,具体的方法为:在“表设计”界面中按Ctrl键选择多行,右击,在弹出的快捷菜单中选择“主键”命令,即可将多列设为主键约束,如图5-13所示。
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P95_6467.jpg?sign=1739321942-1qdGwXz3u78f2aR26ge0ksSA09p7Umhm-0-226f4f0d5608c132c580ca38218ed4ed)
图5-11 执行创建联合主键语句
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P95_6468.jpg?sign=1739321942-dqo6Y9YBXDW4UJFFkoXGuLFpxnFGj5hb-0-3f1801df4efc848bef93180a494dd381)
图5-12 为表添加联合主键约束
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P95_6469.jpg?sign=1739321942-uQFtnjSbNKkuEI9trF9FE04cnxp5vcBz-0-bd86705bef048ec86089dc22aa1968e1)
图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所示。
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P96_6512.jpg?sign=1739321942-Sc8QVQCOJVafU4UrHhhY8WNs9XPBCEaJ-0-1431da630307435f503e48350767dbf5)
图5-14 执行删除主键约束SQL语句
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P96_6513.jpg?sign=1739321942-JRwyJlfD9cjvWxxKSPEskaAoTzxOayMO-0-5a301e827effb44a42eeaee489a9f002)
图5-15 主键约束被删除
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P96_6514.jpg?sign=1739321942-aAqAivEgVbCNPN8hcQM9qoeZTi0Qod8F-0-b5d9b005d959db5ee2a270a1d865b669)
图5-16 单击“删除主键”按钮
(2)表中的主键被删除,如图5-17所示。
另外,通过“索引/键”对话框也可以删除主键,具体操作可以分为如下几步。
(1)打开数据表userinfo的表结构设计窗口,单击工具栏中的“管理索引和键”按钮或者右击,在弹出的快捷菜单中选择“索引/键”命令,如图5-18所示。
(2)打开“索引/键”对话框,选择要删除的索引或键,如图5-19所示。
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P96_6518.jpg?sign=1739321942-viUbNK01RjjOd9CUyKBAmXza7RfxtiPJ-0-274c1c9c9ee0ec05c758db7d24707e82)
图5-17 删除表中的多列主键
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P96_6521.jpg?sign=1739321942-bddMdMX6an12EyFbYownEQ9AtichIaTY-0-6bd005348ba6a5c457ab54387f0f5868)
图5-18 “索引/键”命令
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P96_6522.jpg?sign=1739321942-NX7S38DYEhzvhFaL4WQXYA24WtqSduGQ-0-1f61d82ac13c0402cf6e13a5a8e85f04)
图5-19 “索引/键”对话框
(3)单击“删除”按钮,用户在这里可以选择删除userinfo表中的主键,如图5-20所示。
(4)删除完成之后,单击“关闭”按钮,删除主键操作成功,如图5-21所示。
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P96_6526.jpg?sign=1739321942-nPsMSN6sjrVP7W99KamFGVlTLgCu6w88-0-270e6a37686784ccc409335df842a0cc)
图5-20 删除主键约束
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P96_6527.jpg?sign=1739321942-NZKisEgicQeyCDPn2X5EZWz4p2Yl3cQD-0-2fbd42ddcf12d55913ac59cfaf98f28d)
图5-21 userinfo表结构
![](https://epubservercos.yuewen.com/A2A7FE/17640317507890906/epubprivate/OEBPS/Images/Figure-P97_23476.jpg?sign=1739321942-kb7jlpgTeImwBSuu021Vnf7D3mGlKUiK-0-1df56470f591bc352ff9404b40657a54)
微视频