外键约束

前言

🔖 外键表示一个表中的字段被另一个表中的一个字段引用。外键对相关表中的数据造成了限制,使MySQL能够保持数据完整性。

比如学生和班级表,学生表完全依赖班级表,我们可以通过外键约束让学生表与班级表产生关联,当班级表数据变化时影响学生表。

  • 父表和子表储存引擎要一致
  • 使用InnoDB引擎支持外键约束
  • 外键要与主表列类型一致
  • 外键列使用索引(有些版本的mysql会自动帮助为外键设置索引)

创建外键

新建表

下面创建班级表与学生表,并定义学生表与班级表建立外键约束。

学生表是子表,在子表定义外键,班级表是主表,id在主表。

-- 班级表
CREATE TABLE class (id int PRIMARY KEY AUTO_INCREMENT,name varchar(50));

-- 学生表
CREATE table stu2(
	id int PRIMARY KEY AUTO_INCREMENT,
	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;
1
2
3
4
5
6
7
8
9
10
11
12
13

constraint: 约束

修改表

下面是对学生表添加班级表的外键约束。

ALTER TABLE stu ADD 
CONSTRAINT stu_class
FOREIGN KEY (class_id) 
REFERENCES class(id) 
ON DELETE CASCADE;
1
2
3
4
5

删除

ALTER TABLE stu DROP FOREIGN KEY stu_class;
1

选项说明

下面列出外键关联用到的关键词。

选项说明
CONSTRAINT为外键约束定义名称
FOREIGN KEY子表与父表关联的列
REFERENCES子表关联的父表字段
ON DELETE父表删除时的处理方式
ON UPDATE父表更新时的处理方式

处理动作

ON DELETE

ON DELETE指在删除时的处理方式,常用的处理方式包括以下几种。

选项说明
ON DELETE CASCADE删除父表记录时,子表记录同时删除
ON DELETE SET NULL删除父表记录时,子表记录设置为NULL(子表字段要允许NULL)
ON DELETE NO ACTION删除父表记录时,子表不做任何处理,必须把子表处理完才可以删除主表(子表stu 有数据,主表class不能动,没有引用的时候才能删除)

ON UPDATE

ON UPDATE 指在更新时的处理方式,常用的处理方式包括以下几种。

选项说明
ON UPDATE CASCADE更新父表记录时,比如更改主表的主键(eg. id)时,子表记录同时更新
ON UPDATE SET NULL更新父表记录时,比如更改主表的主键时,子表记录设置为NULL
ON UPDATE NO ACTION更新父表记录时,子表不做任何处理,必须把子表处理完才可以更新主表(没有引用的时候才能更新)
上次更新: 2022/4/23 22:10:22
贡献者: Jerry Chen