外键约束
外键约束是Mysql
提供的一个特性,Mysql
作为一个关系型的数据库,表之间都是有关系的
对于几个表之间的关联,表之间会受影响,一张表发生变化,会影响另一张表(如班级表中的某个班级被删除了,对应学生表中对应这个被删除班级的学生是应该删除呢?还是这些学生的班级为null
呢?这些变化都是关联的变化),这就需要各个表中的某一个字段来建立联系,对于不同表的这个字段,其字段类型要保持一致;一般情况下,与主键(主表的关联键)或者外键进行关联,关联约束的字段内部有一个检索的过程,所以这些关联字段都应该设置索引属性,我们可以不用特意的去设置,在做表关联的时候,Mysql
会自动的给我们设置这些关联字段的索引属性
注意事项:
Mysql
的默认引擎InnoDB
支持外键关联/约束- 外键指向的主表则必须具有主键约束或者是
unique
约束 - 外键字段的类型要和主键字段的类型一致
- 外键字段的值,必须要在主键字段中出现过,或者为
null
(前提是外键字段允许为null
) - 一旦建立了外键的关系,数据就不能随意删除了
表中定义外键约束
常用的外键约束关键词:
选项 | 说明 |
---|---|
CONSTRAINT | 为外键约束定义名称 |
FOREIGN KEY | 子表与父表关联的列 |
REFERENCES | 子表关联的父表字段 |
ON DELETE | 父表删除时的处理方式 |
ON UPDATE | 父表更新时的处理方式 |
从新建表开始
新建一张表(从表),并添加外键约束:
sql
CREATE TABLE stu2(
id int PRIMARY KEY AUTO_INCREMENT, # 设置id为主键,且自增
sname char(30) NOT NULL,
class_id int DEFAULT NULL,
# 声明外键和定义外键
CONSTRAINT stu2_class
FOREIGN KEY (class_id) REFERENCES class(id)
# 定义主表发生变化时,子表的动作
# 当班级某条数据执行删除的时候,对应班级的学生数据跟着删除
ON DELETE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8; # 定义引擎和字符集
新键的学生表不单单只与班级表进行关联,还可以与其他的表进行关联,这样我们就要定义多个外键,为了区分,我们一般是给外键取一个别名,这个别名一定是要唯一的,一般情况下以当前表的名字-关联表的名字即可
在哪个表中定义外键,哪个表就是子表,外键最好是要指向另一张表的主键,可以不指向主键,但是指向的这个字段必须有索引属性
基于修改表
对于存在的表,如果后续我们想要添加外键约束,我们可以进行以下操作:
sql
ALTER TABLE stu ADD
# 声明外键和定义外键
CONSTRAINT stu_class
FOREIGN KEY (class_id)
REFERENCES class(id)
# 定义主表发生变化时,子表的动作
# 当班级某条数据执行删除的时候,对应班级的学生数据跟着删除
ON DELETE CASCADE;
删除外键约束
删除学生表stu
中的外键约束:
sql
ALTER TABLE stu DROP FOREIGN KEY stu_class;
外键约束的关联动作
ON DELETE
ON DELETE
是指在删除时的处理方式,常用的处理方式有:
选项 | 说明 |
---|---|
ON DELETE CASCADE | 删除父表记录时,子表中关联这条父表记录的所有子表记录会同时删除 |
ON DELETE SET NULL | 删除父表记录时,子表记录对应的外键变为为 NULL(子表字段要允许 NULL) |
ON DELETE NO ACTION | 不能直接删除父表记录,必须把子表外键处理(删除或修改)完才可以删除主表中对应的内容,具体来说,就是子表有数据,主表不能动 |
ON DELETE RESTRICT | 与ON DELETE NO ACTION 一致 |
ON UPDATE
ON UPDATE
是指在更新时的处理方式,常用的处理方式有:
选项 | 说明 |
---|---|
ON UPDATE CASCADE | 更新父表记录时,比如更改主表的主键时,子表对应的外键内容同时更新 |
ON UPDATE SET NULL | 更新父表记录时,比如更改主表的主键时,子表对应的外键被设置为 NULL |
ON UPDATE NO ACTION | 不能直接更新父表记录,必须把子表外键处理(删除或修改)完才可以更新主表 |
ON UPDATE RESTRICT | 与ON UPDATE NO ACTION 一致 |
父表更新时,子表对应的更新无非就是更新对应的外键内容,如更改主键的编号,改为6,那么对应匹配外键的编号也会变为6,这个就是ON UPDATE CASCADE
更新的过程,关联受影响
更新的应用场景相较于删除是很低的