1
数据库技术及应用
1.7.4.7 4.4.7 FOREIGN KEY
4.4.7 FOREIGN KEY

FOREIGN KEY约束为表中一列或多列数据提供参照完整性,限制表中被约束列的值必须在被引用表中已经存在,例如,在图438学生的选课表中,所选的课程,其代码必须在课程表(Course_info表)中存在,否则学生所选的课程是不存在的,毫无意义。为了保证两张或者多张表中数据的一致性,引入了外键约束。

【例4-17】在SC选课信息表中,将Cid字段的外键设置为课程表(Course_info)中的Cid字段。

1.使用SSMS管理器创建外键约束

图4-38 学生选课表

使用SSMS管理器创建外键约束,具体步骤如下:

(1)启动SQL Server Management Studio,在其“对象资源管理器”窗格中依次展开“数据库”节点、Student节点和“表”节点,在dbo.SC上单击鼠标右键,在弹出的快捷菜单中执行“设计”命令,如图4-39所示。

(2)在打开窗口的右上部分,鼠标右键单击字段Cid,在弹出的快捷菜单中执行“关系”命令,如图4-40所示。

图4-39 执行“设计”命令

图4-40 执行“关系”命令

(3)打开“外键关系”对话框,单击“添加”按钮,然后选择右侧列表框中的“表和列规范”选项,该选项右边弹出按钮,如图441所示。

图4-41 编辑关系属性

(4)单击“表和列规范”选项右边的按钮,弹出“表和列”对话框,选择要建立关系的主键表Course_info以及两个表中对应的列Cid,设置完成后单击“确定”按钮,如图442所示。

图4-42 设置主键表和外键表

(5)返回“外键关系”对话框,单击右下方的“关闭”按钮即可。

2.使用T-SQL语句创建外键约束

创建外键约束的基本语句格式如下:

更为普遍的做法是在创建SC表时,就把外键约束设置写进T-SQL代码中:

实战演练——维护BBS数据的完整性

为了维护BBS数据的完整性,对其进行主键、非空性、唯一性、检查性、默认值及外键约束的设置,具体要求如下:

(1)由于在用户信息表(tb_Users)中,需要将用户编号(User Id)作为记录唯一区分的标志,可以把用户编号设置为该表的主键约束;

(2)由于在发帖信息表(tb_Topic)中,要求帖子标题(TSubject)不能为空,需要将帖子标题设置为该表的非空性约束;

(3)由于在发帖信息表(tb_Topic)中,要求帖子标题(TSubject)不能相同,但帖子编号(TId)已经设置为主键,需要将帖子标题设置为该表的唯一性约束;

(4)由于在用户信息表(tb_Users)中,要求电子邮箱(Email)必须包含“@”,可以把电子邮箱设置为该表的检查性约束;

(5)由于在用户信息表(tb_Users)中,要求电子邮箱(Email)默认为“163.com”,可以把电子邮箱设置为该表的默认值约束;

(6)由于在发帖信息表(tb_Topic)中,要求发帖人编号(Tuser Id)必须为已有的用户信息表(tb_Users)中的用户编号,需要将发帖人编号设置为该表的外键约束。

文件存放位置为D:\SQL Server,操作步骤如下。

1.用SSMS维护BBS数据的完整性

1)主键(PRIMARYKEY)

下面设置主键,具体步骤如下:

步骤1:启动SQL Server Management Studio,在其“对象资源管理器”窗格中依次展开“数据库”节点、BBS节点和“表”节点,在dbo.tb_Users上单击鼠标右键,在弹出的快捷菜单中执行“设计”命令,如图4-43所示。

图4-43 执行“设计”命令

步骤2:在打开窗口的右上部分,右键单击要设置PRIMARYKEY的列,如User Id,在弹出的快捷菜单中执行“设置主键”命令,如图4-44所示。

步骤3:设置完成后,在该字段前面将会显示一把钥匙图标,表示主键设置成功,如图4-45所示。

图4-44 执行“设置主键”命令

图4-45 主键设置成功

2)非空性(NOTNULL)约束

下面设置非空性约束,具体步骤如下:

步骤1:启动SQL Server Management Studio,在其“对象资源管理器”窗格中依次展开“数据库”节点、BBS节点和“表”节点,在dbo.tb_Topic上单击鼠标右键,在弹出的快捷菜单中执行“设计”命令,如图4-46所示。

步骤2:在打开窗口的右上部分,取消选中TSubject字段的“允许Null值”复选框,如图4-47所示。

图4-46 执行“设计”命令

图4-47 设置Null值

3)唯一性(UNIQUE)约束

下面设置唯一性约束,具体步骤如下:

步骤1:启动SQL Server Management Studio,在其“对象资源管理器”窗格中依次展开“数据库”节点、BBS节点和“表”节点,在dbo.tb_Topic表上单击鼠标右键,在弹出的快捷菜单中执行“设计”命令,如图448所示。

步骤2:在打开窗口的右上部分,右键单击要设置唯一键的列,如TSubject,在弹出的快捷菜单中执行“索引/键”命令,如图4-49所示。

图4-48 执行“设计”命令

图4-49 执行“索引/键”命令

步骤3:打开“索引/键”对话框,单击左下方的“添加”按钮,然后单击右侧列表框中的“列”选项,该选项右边弹出按钮,如图450所示。

图4-50 编辑“索引/键”的属性

步骤4:单击“列”选项右边的按钮,弹出“索引列”对话框,在“列名”的下拉列表中选择要设置唯一键的TSubject字段,如图451所示,单击“确定”按钮。

步骤5:返回“索引/键”对话框,单击右下方的“关闭”按钮即可。

4)检查性(CHECK)约束

下面设置检查性约束,具体步骤如下:

步骤1:启动SQL Server Management Studio,在其“对象资源管理器”窗格中依次展开“数据库”节点、BBS节点和“表”节点,在dbo.tb_Users上单击鼠标右键,在弹出的快捷菜单中执行“设计”命令,如图4-52所示。

图4-51 选定唯一键字段

图4-52 执行“设计”命令

图4-53 执行“犆犎犈犆犓约束”命令

步骤2:在打开窗口的右上部分,鼠标右键单击字段Email,在弹出的快捷菜单中执行“CHECK约束”命令,如图4-53所示。

步骤3:打开“CHECK约束”对话框,单击“添加”按钮,在右侧列表框的表达式中输入“Emaillike%@%”,单击“关闭”按钮,如图4-54所示。

图4-54 设置约束表达式

5)默认值(DEFAULT)约束

下面设置默认值约束,具体步骤如下:

步骤1:启动SQL Server Management Studio,在其“对象资源管理器”窗格中依次展开“数据库”节点、BBS节点和“表”节点,在dbo.tb_Users上单击鼠标右键,在弹出的快捷菜单中执行“设计”命令,如图4-55所示。

步骤2:在打开窗口的右上部分,鼠标单击Email字段,在窗口的右下方有“列属性”列表框,在“默认值或绑定”行的右边输入163.com,如图4-56所示。

图4-55 执行“设计”命令

图4-56 输入默认值

6)外键(FOREIGNKEY)约束

下面设置外键约束,具体步骤如下:

步骤1:启动SQL Server Management Studio,在其“对象资源管理器”窗格中依次展开“数据库”节点、BBS节点和“表”节点,在dbo.tb_Topic上单击鼠标右键,在弹出的快捷菜单中执行“设计”命令,如图4-57所示。

图4-57 执行“设计”命令

图4-58 执行“关系”命令

步骤2:在打开窗口的右上部分,鼠标右键单击字段TUser Id,在弹出的快捷菜单中执行“关系”命令,如图4-58所示。

步骤3:打开“外键关系”对话框,单击“添加”按钮,然后选择右侧列表框中的“表和列规范”选项,该选项右边弹出按钮,如图459所示。

图4-59 选择“表和列规范”选项

步骤4:单击“表和列规范”选项右边的按钮,弹出“表和列”对话框,选择要建立关系的主键表tb_Users以及两个表中对应的列User Id和TUser Id,完成后单击“确定”按钮,如图460所示。

图4-60 设置主键表和外键表

步骤5:返回“外键关系”对话框,单击右下方的“关闭”按钮完成外键约束设置的操作。

2.用T-SQL语句维护BBS数据的完整性

1)主键(PRIMARYKEY)

采用T-SQL语句设置主键,具体步骤如下:

步骤1:启动MicrosofT-SQL Server Management Studio。

步骤2:单击工具栏上的按钮,或者执行“文件”→“新建”→“使用当前连接查询”命令,建立一个新的查询。

步骤3:在查询编辑窗口中编辑如下T-SQL代码:

步骤4:单击工具栏上的按钮来执行以上T-SQL代码,完成用户信息表(tb_Users)主键的设置。

2)非空性(NOTNULL)约束

采用T-SQL语句设置非空性约束,具体步骤如下:

步骤1:启动MicrosofT-SQL Server Management Studio。

步骤2:单击工具栏上的按钮,或者执行“文件”→“新建”→“使用当前连接查询”命令,建立一个新的查询。

步骤3:在查询编辑窗口中编辑如下T-SQL代码:

步骤4:单击工具栏上的按钮来执行以上T-SQL代码,完成发帖信息表(tb_Topic)非空性约束的设置。

3)唯一性(UNIQUE)约束

采用T-SQL语句设置唯一性约束,具体步骤如下:

步骤1:启动MicrosofT-SQL Server Management Studio。

步骤2:单击工具栏上的按钮,或者执行“文件”→“新建”→“使用当前连接查询”命令,建立一个新的查询。

步骤3:在查询编辑窗口中编辑如下T-SQL代码:

步骤4:单击工具栏上的按钮来执行以上T-SQL代码,完成发帖信息表(tb_Topic)唯一性约束的设置。

4)检查性(CHECK)约束

采用T-SQL语句设置检查性约束,具体步骤如下:

步骤1:启动MicrosofT-SQL Server Management Studio。

步骤2:单击工具栏上的按钮,或者执行“文件”→“新建”→“使用当前连接查询”命令,建立一个新的查询。

步骤3:在查询编辑窗口中编辑如下T-SQL代码:

步骤4:单击工具栏上的按钮来执行以上T-SQL代码,完成用户信息表(tb_Users)检查性约束的设置。

5)默认值(DEFAULT)约束

采用T-SQL语句设置默认值约束,具体步骤如下:

步骤1:启动MicrosofT-SQL Server Management Studio。

步骤2:单击工具栏上的按钮,或者执行“文件”→“新建”→“使用当前连接查询”命令,建立一个新的查询。

步骤3:在查询编辑窗口中编辑如下T-SQL代码:

步骤4:单击工具栏上的按钮来执行以上T-SQL代码,完成用户信息表(tb_Users)默认值约束的设置。

6)外键(FOREIGNKEY)约束

采用T-SQL语句设置外键约束,具体步骤如下:

步骤1:启动MicrosofT-SQL Server Management Studio。

步骤2:单击工具栏上的按钮,或者执行“文件”→“新建”→“使用当前连接查询”命令,建立一个新的查询。

步骤3:在查询编辑窗口中编辑如下T-SQL代码:

步骤4:单击工具栏上的按钮来执行以上T-SQL代码命令,完成发帖信息表(tb_Topic)外键约束的设置。