# 外键约束

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

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

  • 父表和子表储存引擎要一致
  • 使用InnoDB引擎支持外键约束
  • 外键更与主表列类型一致
  • 外键列使用索引(数据库会自动添加索引)

# 创建外键

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

# 新建表

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

-- 班级表
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 UPDATE 指在更新时的处理方式,常用的处理方式包括以下几种。

选项 说明
ON DELETE CASCADE 删除父表记录时,子表记录同时删除
ON DELETE SET NULL 删除父表记录时,子表记录设置为NULL(子表字段要允许NULL)
ON DELETE NO ACTION
ON DELETE RESTRICT
删除父表记录时,子表不做任何处理,必须把子表处理完才可以删除主表

# ON UPDATE

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

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

#