为了更好的理解外键,我们假设有一个学生表,表中字段(学号,姓名,班级,课程id),同时有个课程表(课程id,课程名);这个时候,学生表中的课程id就可以作为外键,从属于课程表中的课程id。
MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。
主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。
外键定义规则
- 主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
- 必须为主表定义主键。主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
- 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
- 外键中列的数目必须和主表的主键中列的数目相同。
- 外键中列的数据类型必须和主表主键中对应列的数据类型相同。
外键作用
保证数据的完整性,一致性主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。
外键表约束语句
设置外键约束
在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键,语句如下:[CONSTRAINT 外键约束别名 ] FOREIGN KEY 子表外键字段 REFERENCES 父表 字段名;
说明
- [ ] 中内容可以省略,但是最好设置,主要是在删除外键约束的时候比较方便,不然系统会设定默认需要人为去查询默认值。
- 也可以在修改表时添加外键约束,语句如下
ALTER TABLE <数据表名> ADD CONSTRAINT <外键名> FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
删除外键约束
当一个表中不需要外键约束时,就需要从表中将其删除。外键一旦删除,就会解除主表和从表间的关联关系。
- 删除外键约束的语法格式如下所示:
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
外键约束的作用
阻止执行
- 从表插入新行,其外键值不是主表的主键值便阻止插入;
- 从表修改外键值,新值不是主表的主键值便阻止修改;
- 主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);
- 主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。
级联删除
- 主表删除行,连带从表的相关行一起删除;
- 主表修改主键值,连带从表相关行的外键值一起修改。两种方法提供给用户选择。无论选取哪种方法,从表里都不会有多余行。从另一个角度理解,用拒绝同一事物在从表中的标志与主表不一致来实现与主表中的标志一致。
两种实现方法,通过下面方式选择: - 界面:设级联更新、级联删除两个选择方框,选取则级联执行、不选取则阻止执行;
- 命令:设E)kSCM)E、RESTRICT两个可选项,CASCADE为级联执行、RESTRICT为阻止执行。