MYSQL外键的作用

这篇文章我们来了解下mysql中外键的作用。

如果一张表中有一个非主键的字段指向了另一张表中的主键,就将该字段叫做外键。一张表中外键可以有多个,也就是不同字段指向了不同表中的主键。需要注意数据表的存储引擎必须为InnoDB,因为InnoDB提供事务支持以及外部键等高级数据库功能,相反的MyISAM不支持。

外键的作用是保持数据一致性、完整性,主要体现在下面两个方面:

阻止执行

从表插入新行,其外键值不是主表的主键值便阻止插入;
从表修改外键值,新值不是主表的主键值便阻止修改;
主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);
主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。

级联执行

主表删除行,连带从表的相关行一起删除;
主表修改主键值,连带从表相关行的外键值一起修改。

下面我们就来看看具体的事例:

# 创建数据库
CREATE DATABASE Test;
USE TEMP;

# 创建表
CREATE TABLE student(id int (11) primary key auto_increment,name char(255),sex char(255),age int(11))charset utf8;
CREATE TABLE student_score(id int (11) primary key auto_increment,class char(255),score char(255),student_id int(11))charset utf8;
Alter table student_score add constraint s_id foreign key(student_id) references student(id);

# 插入学生信息
INSERT INTO student(name,sex,age) VALUES('学生1','男','12');

# 插入学科及分数信息
INSERT INTO student_score(class,score,student_id) VALUES('语文','100',1);
INSERT INTO student_score(class,score,student_id) VALUES('数学','100',1);
INSERT INTO student_score(class,score,student_id) VALUES('英语','100',1);

通过命令行查看表结构:


MYSQL外键的作用_第1张图片
image.png

添加后的内容在数据库中展示为:


MYSQL外键的作用_第2张图片
image.png

接下来我们验证下外键的作用:
1. 从表插入新行,其外键值不是主表的主键值便阻止插入
image.png
2. 从表修改外键值,新值不是主表的主键值便阻止修改
image.png
3. 主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行)
image.png
4. 主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)
image.png
5. 主表修改主键值,连带从表相关行的外键值一起修改

做这个之前,首先需要改下外键的约束条件

#删除外键
alter table student_score drop foreign key s_id;
#加入CASCADE约束外键
Alter table student_score add constraint s_id foreign key(student_id) references student(id) ON DELETE CASCADE ON UPDATE CASCADE;

通过命令行查看表结构:


MYSQL外键的作用_第3张图片
image.png

接下来做update操作:


MYSQL外键的作用_第4张图片
image.png
6. 主表删除行,连带从表的相关行一起删除
MYSQL外键的作用_第5张图片
image.png

你可能感兴趣的:(MYSQL外键的作用)