Skip to content

外键约束

外键约束是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 RESTRICTON DELETE NO ACTION一致

ON UPDATE

ON UPDATE是指在更新时的处理方式,常用的处理方式有:

选项说明
ON UPDATE CASCADE更新父表记录时,比如更改主表的主键时,子表对应的外键内容同时更新
ON UPDATE SET NULL更新父表记录时,比如更改主表的主键时,子表对应的外键被设置为 NULL
ON UPDATE NO ACTION不能直接更新父表记录,必须把子表外键处理(删除或修改)完才可以更新主表
ON UPDATE RESTRICTON UPDATE NO ACTION一致

父表更新时,子表对应的更新无非就是更新对应的外键内容,如更改主键的编号,改为6,那么对应匹配外键的编号也会变为6,这个就是ON UPDATE CASCADE更新的过程,关联受影响

更新的应用场景相较于删除是很低的

Released under the MIT License.