这篇文章我们来了解下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);
通过命令行查看表结构:
添加后的内容在数据库中展示为:
接下来我们验证下外键的作用:
1. 从表插入新行,其外键值不是主表的主键值便阻止插入
2. 从表修改外键值,新值不是主表的主键值便阻止修改
3. 主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行)
4. 主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)
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;
通过命令行查看表结构:
接下来做update操作: