本篇文章小编给大家分享一下mysql外键基本功能与用法解析,对大家学习mysql外键有一定的帮助,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
什么是外键:
外键就是表中存在一个字段指向另外一个表的主键,那么这个字段就可以称为外键。
一张表可以有多个外键。
外键用于约束表与表之间的关系,可以说外键是表之间的映射关系,这个关系可以帮助我们处理表之间关系的紧密性和存在性(比如学生表的cid班级号与班级表的id建立关联,cid应该不能为不存在的,如果不增加外键cid,没有建立上关系,我们就不知道班级号不存在。)。
或者说,外键是告诉数据库系统,我们所认为的关系,单纯的数据,系统是不知道实际意义的,外键就是告诉系统应该如何处理他们的关系。
所以,外键的核心是约束。
外键的增加:
创建外键的前提是该字段首先是一个索引,如果不是的话,创建外键是会创建成一个普通索引【所以可以不在意】。
创建外键的另外一个前提是“指向表”已经创建,对于一个不存在的表,将无法使用外键对应上。
增加的方式:
1.在创建表的时候定义,在所有字段定义结束后使用foreign key(外键字段) references 指向表(主键)来 定义,
比如
2.也可以修改字段来增加: alter table 表名 add [constraint 外键名字] foreign key(外键字段) references 父表(主键字段);
constraint 外键名字:可以帮助定义外键的名字,但不建议使用,因为要求外键名都唯一,而使用系统自定义的绝对不会重复,
create table student( id int primary key auto_increment, name varchar(15) not null, gender varchar(10) not null, cid int, foreign key(cid) references class(id) );
create table class( id int primary key auto_increment, cname varchar(15) );
补充:
在Mysql中,如果存储引擎不是innodb,那么无法使外键的约束作用生效,即使是能成功增加外键。
外键名不能重复,所以不建议使用constraint 外键名字
外键的修改与删除:
修改:不能修改外键信息,如外键指向之类的,只能先删除再新增。
删除语法:alter table 表名 drop foreign key 外键名;
这里的外键名不是外键字段,而是外键名。如果没有使用constraint来定义,可以通过show create来查看表创建语句中系统定义的外键名。
补充:
删除外键时,如果使用desc会看到表结构还有MUL,那是一个索引。因为创建外键时,字段会被创建成一个索引。如果不想保留,可以使用drop index 字段名 on 表名.
外键的约束模式:
外键是用来约束表之间的关系的。
(约定创建外键的表称为子表,指向的表称为父表)
针对子表:可以约束子表的插入和修改【这种约束是父表对子表的约束】
涉及到外键的插入和修改时,如果外键字段找不到对应的匹配那么会插入修改失败(像插入选课记录不可能插入一门课程表中没有的课程)。
比如:
针对父表:可以约束父表的删除和更新,通常有可以以下几种约束模式。【这种约束是子表对父表的约束】
模式:
strict严格模式:涉及到外键的删除和更新时,如果对应记录的主键数据已经被子表使用时,那么无法删除(像已经有人入学了某个班级,学校不可能犯傻去把某个班级删除,只能删除那些没人入学的班级。)
cascade级联模式:涉及到外键的删除和更新时,如果字段已经被子表使用,子表中的数据会对应更新(像某个班改了班号,那么学生表中的班别都对应更改;如果某个班被删除,就删除对应班的所有学生)
set null置空模式:涉及到外键的删除和更新时,如果字段已经被子表使用,那么子表中的外键数据会置空(像某个班被删掉了,不应该删掉所有学生,而是应该给他们先置空再重新分配班别)【子表允许置空的前提是该字段允许为空】
其实可以给不同操作指定不同模式
综上所述(根据我的那些举例),实际上,合适的举措是删除时置空(即使某个班太垃圾了,想删除某个班,但也不应该将所有学生退学,而是将它们分到别的班),修改时级联(允许更改班号,而且更改会更新到学生中)
不同操作设置不同模式的设置方法(在子表中操作):foreign key(外键字段) references 父表(主键) on 操作 模式
foreign key(外键字段) references 父表 (主键) on delete set null on update cascade;
-- 实验表结构 create table class( id int primary key auto_increment, cname varchar(15) ); create table student2( id int primary key auto_increment, name varchar(15) not null, gender varchar(10) not null, cid int, foreign key(cid) references class(id) on delete set null on update cascade ); -- 实验表数据: insert into class(cname) values("python"),("linux"),("java"),("html5"); insert into student2(name,gender,cid) values("Alice","female",1); insert into student2(name,gender,cid) values("John","female",2); insert into student2(name,gender,cid) values("Jack","female",3); insert into student2(name,gender,cid) values("Amy","female",4); select * from student2; select * from class; -- 尝试更新级联 update class set id = 6 where cname="python"; select * from student2; -- 结果原来的python的cid=6 -- 尝试删除置空 delete from class where cname="java"; select * from student2; -- 结果原来的java的cid=null
补充:
需要设置好约束模式,不要在多个子表中使用不同的约束模式,不然会冲突。
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整