Appearance
外建约束
外键表示一个表中的字段被另一个表中的一个字段引用。外键对相关表中的数据造成了限制,使 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 | 更新父表记录时,子表不做任何处理,必须把子表处理完才可以更新主表 |