5.3 外键约束

外键用来在两个表的数据之间建立链接,它可以是一列或者多列。首先,被引用表的关联字段上应该创建PRIMARY KEY约束或UNIQUE约束,然后,在应用表的字段上创建FOREIGN KEY约束,从而创建外键。

5.3.1 创建表时添加外键约束

外键约束的主要作用是保证数据引用的完整性,定义外键后,不允许删除在另一个表中具有关联的行。例如,部门表tb_dept的主键id,在员工表emp中有一个键deptId与这个id关联。外键约束中涉及的数据表有主表与从表之分,具体介绍如下。

  • 主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的那个表即是主表。
  • 从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的那个表即是从表。

创建外键约束的语法格式如下:

主要参数介绍如下。

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

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

表5-2 图书信息表结构

表5-3 图书分类表结构

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

首先创建test数据库,然后指定数据库,并创建图书分类表Booktype,输入以下SQL语句:

单击“执行”按钮,即可完成创建数据表的操作,如图5-13所示。执行完成之后,使用“DESC Booktype;”语句即可看到该数据表的结构,如图5-14所示。

图5-13 创建表Booktype

图5-14 Booktype表结构

下面定义数据表Bookinfo,让它的Typeid字段作为外键关联到Booktype数据表中的主键id,输入以下SQL语句:

单击“执行”按钮,即可完成在创建数据表时创建外键约束的操作,如图5-15所示。

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

执行完成后,使用“DESC Bookinfo;”语句即可看到该数据表的结构。这样就在表Bookinfo上添加了名称为“fk_图书分类编号”的外键约束,其依赖于表Booktype的主键id,如图5-16所示。

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

图5-16 Bookinfo表的结构

5.3.2 修改表时添加外键约束

如果创建数据表时没有创建外键,可以使用ALTER语句对现有表创建外键。使用ALTER语句可以将外键约束添加到数据表中,添加外键约束的语法格式如下:

主要参数介绍如下。

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

【实例7】在test数据库中,假设创建Bookinfo数据表时没有设置外键约束,如果想要添加外键约束,输入如下SQL语句:

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

单击“执行”按钮,即可完成在创建数据表后添加外键约束的操作,如图5-17所示。该语句执行之后的结果与创建数据表时创建外键约束的结果是一样的。

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

图5-17 执行SQL语句

5.3.3 删除表中的外键约束

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

通过DROP语句删除外键约束的语法格式如下:

    ALTER TABLE table_name
    DROP FOREIGN KEY fk_name;

主要参数介绍如下。

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

【实例8】在test数据库中,删除Bookinfo表中添加的“fk_图书分类”外键,输入如下SQL语句:

    ALTER TABLE Bookinfo
    DROP FOREIGN KEY fk_图书分类;

单击“执行”按钮,即可完成在删除外键约束的操作,如图5-18所示。

图5-18 删除外键约束