5.3 FOREIGN KEY约束

外键用于建立一个或多个表的字段之间的引用联系。首先,被引用表的关联字段上应该创建PRIMARY KEY约束或UNIQUE约束,然后,在应用表的字段上创建FOREIGN KEY约束,从而创建外键。

5.3.1 创建表时创建外键

外键约束的主要作用是保证数据引用的完整性,定义外键后,不允许删除在另一个表中具有关联的行。创建外键约束的语法规则如下。

主要参数介绍如下。

  • fk_name:定义的外键约束的名称,一个表中不能有相同名称的外键。
  • col_name1:表示从表需要创建外键约束的字段列,可以由多个列组成。
  • referenced_table_name:即被从表外键所依赖的表的名称。
  • ref_col_name1:被应用的表中的列名,也可以由多个列组成。

这里以图书信息表Bookinfo(表5-2)与图书分类表Booktype(表5-3)为例,介绍创建外键约束的过程。

表5-2 图书信息表结构

表5-3 图书分类表结构

实例5:在test数据库中,定义数据表Bookinfo,并在Bookinfo表上创建外键约束。

首先创建图书分类表Booktype,在“查询编辑器”窗口中输入以下语句。

单击“执行”按钮,即可完成创建数据表的操作,如图5-22所示。执行完成之后,选择创建的数据表,然后打开该数据表的设计图,即可看到该数据表的结构,如图5-23所示。

图5-22 创建表Booktype

图5-23 Booktype表的设计图

下面定义数据表Bookinfo,让它的键“所属分类”作为外键关联到Booktype的主键“分类id”,在“查询编辑器”窗口中输入以下语句。

单击“执行”按钮,即可完成在创建数据表时创建外键约束的操作,如图5-24所示。选择创建的数据表Bookinfo,然后打开该数据表的设计图,即可看到该数据表的结构,这样就在表Bookinfo上添加了名称为“fk_图书分类编号”的外键约束,外键名称为“所属分类”,其依赖于表Booktype的主键“分类id”,如图5-25所示。

图5-24 创建表的外键约束

图5-25 Bookinfo表的设计

外键约束创建完成后,我们还可以对其进行查看,查看方法为:选择要查看的数据表节点,例如这里选择Booktype表,右击,在弹出的快捷菜单中选择“查看依赖关系”命令,打开“对象依赖关系”窗口,将显示与外键约束相关的信息,如图5-26所示。

提示:外键一般不需要与相应的主键名称相同,但是,为了便于识别,当外键与相应主键在不同的数据表中时,通常使用相同的名称。另外,外键不一定要与相应的主键在不同的数据表中,也可以在同一个数据表中。

图5-26 “对象依赖关系”窗口

5.3.2 修改表时创建外键

如果创建数据表时没有创建外键,我们可以使用ALTER语句或在SQL Server Management Studio中对现有表创建外键。

1. 使用ALTER语句创建外键

使用ALTER语句可以将FOREIGN KEY约束添加到数据表中,添加外键约束的语法格式如下:

      ALTER TABLE table_name
      ADD CONSTRAINT fk_name FOREIGN KEY(col_name1, col_name2,…) REFERENCES
      referenced_table_name(ref_col_name1, ref_col_name2,…);

主要参数介绍如下。

  • CONSTRAINT:创建约束的关键字。
  • fk_name:设置外键约束的名称。
  • FOREIGN KEY:表示所创建约束的类型为外键约束。

实例6:在test数据库中,假设创建Bookinfo数据表时没有设置外键约束,如果想要添加外键约束,需要在“查询编辑器”窗口中输入如下语句。

      ALTER TABLE Bookinfo
      ADD
      CONSTRAINT fk_图书分类
      FOREIGN KEY(所属分类) REFERENCES Booktype(分类id)

图5-27 执行添加外键约束语句

单击“执行”按钮,即可完成在创建数据表后创建外键约束的操作,如图5-27所示。在创建完外键约束之后,可以查看创建的外键约束,这里选择Booktype表,右击,在弹出的快捷菜单中选择“查看依赖关系”命令,打开“对象依赖关系”窗口,将显示与外键约束相关的信息,如图5-28所示。该语句执行之后的结果与创建数据表时创建外键约束的结果是一样的。

2. 以图形向导方式添加外键约束

使用SQL Server Management Studio创建数据表的外键要比创建主键复杂一些,具体过程可以分为如下几步:

(1)在“对象资源管理器”中选择要添加Bookinfo表的数据库,这里选择test数据库,展开表节点,右击,在弹出的快捷菜单中选择“新建”→“表”命令,即可进入表设计界面,按照表5-2所示的结构添加图书信息表Bookinfo,如图5-29所示。

(2)参照步骤(1)的方法,添加图书分类表Booktype,如图5-30所示。

图5-28 “对象依赖关系”窗口

图5-29 图书信息表设计界面

图5-30 图书分类表设计界面

(3)选择图书信息表Bookinfo,在表设计界面中右击,在弹出的快捷菜单中选择“关系”命令,如图5-31所示。

(4)打开“外键关系”对话框,在其中单击“添加”按钮,即可添加选定的关系,然后选择“表和列规范”选项,如图5-32所示。

图5-31 选择“关系”命令

图5-32 “外键关系”对话框

(5)单击“表和列规范”右侧的“”按钮,打开“表和列”对话框,从中可以看到左侧是主键表,右侧是外键表,如图5-33所示。

(6)这里要求给图书信息表Bookinfo创建外键,因此外键表是图书信息表,主键表是图书分类表Booktype,根据要求,设置主键表与外键表,如图5-34所示。

(7)设置完毕后,单击“确定”按钮,即可完成外键的创建操作。

注意:在为数据表创建外键时,主键表与外键表,必须创建相应的主键约束,否则在创建外键的过程中,会给出警告信息。

图5-33 “表和列”对话框

图5-34 设置主键表与外键表

5.3.3 删除表中的外键

当数据表中不需要使用外键时,可以将其删除,删除外键约束的方法和删除主键约束的方法相同,删除时指定外键名称。

1. 使用DROP语句删除外键

通过DROP语句删除FOREIGN KEY约束的语法格式如下。

      ALTER TABLE table_name
      DROP CONSTRAINT fk_name

主要参数介绍如下。

  • table_name:要去除外键约束的表名。
  • fk_name:外键约束的名字

实例7:在test数据库中,删除Bookinfo表中添加的“fk_图书分类”外键,在“查询编辑器”窗口中输入如下语句。

      ALTER TABLE Bookinfo
      DROP CONSTRAINT fk_图书分类;

单击“执行”按钮,即可完成删除外键的操作,如图5-35所示。再次打开该表与其他依赖关系的窗口,可以看到依赖关系消失,确认外键删除成功,如图5-36所示。

图5-35 删除外键约束

图5-36 “对象依赖关系”窗口

2. 以图形向导方式删除外键

使用SQL Server Management Studio可以以图形向导方式删除外键约束,删除过程可以分为如下几个步骤。

(1)打开添加有外键的数据表,这里打开图书信息表Bookinfo的设计页面,如图5-37所示。

(2)在图书信息表中右击,在弹出的快捷菜单中选择“关系”命令,如图5-38所示。

图5-37 图书信息表设计界面

图5-38 选择“关系”命令

(3)打开“外键关系”对话框,在“选定的关系”列表中选择要删除的外键约束,如图5-39所示。

图5-39 “外键关系”对话框

(4)单击“删除”按钮,即可将其外键约束删除,如图5-40所示。

图5-40 删除外键约束

微视频