Skip to content

外键约束

向军大叔每晚八点在 抖音bilibli 直播

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

比如学生和班级表,学生表完全依赖班级表,我们可以通过外键约束让学生表与班级表产生关联,当班级表数据变化时影响学生表,下面大叔带你详细掌握外键约束。

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

创建外键

下面我们先创建表关联后,再详细解释里面的参数选项。

新建表

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

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

-- 学生表
CREATE TABLE stu (
  `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `sname` varchar(30) DEFAULT NULL,
  `class_id` int(11) DEFAULT NULL,
  CONSTRAINT `stu_class`
  FOREIGN KEY (`class_id`)
  REFERENCES `class` (`id`)
  ON DELETE CASCADE
  ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

修改表

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

ALTER TABLE stu ADD
CONSTRAINT stu_class
FOREIGN KEY (class_id)
REFERENCES class(id)
ON DELETE SET NULL
ON UPDATE CASCADE;

删除

ALTER TABLE stu DROP FOREIGN KEY stu_class;

选项说明

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

选项说明
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
ON DELETE RESTRICT
删除父表记录时,子表不做任何处理,必须把子表处理完才可以删除主表

ON UPDATE

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

选项说明
ON UPDATE CASCADE更新父表记录时,比如更改主表的主键时,子表记录同时更新
ON UPDATE SET NULL更新父表记录时,比如更改主表的主键时,子表记录设置为 NULL
ON UPDATE NO ACTION
ON UPDATE RESTRICT
更新父表记录时,子表不做任何处理,必须把子表处理完才可以更新主表