如何使用mysql外键
发表于:2024-09-21 作者:千家信息网编辑
千家信息网最后更新 2024年09月21日,这篇文章主要为大家展示了如何使用mysql外键,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。什么是外键:外键就是表中存在一个字段指向另外一个表的主键,那
千家信息网最后更新 2024年09月21日如何使用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
补充:
- 需要设置好约束模式,不要在多个子表中使用不同的约束模式,不然会冲突。
以上就是关于如何使用mysql外键的内容,如果你们有学习到知识或者技能,可以把它分享出去让更多的人看到。
字段
模式
更新
学生
数据
班级
不同
指向
系统
之间
名字
索引
前提
就是
而是
被子
学习
内容
多个
实际
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
区块链服务器商用
部队网络安全反思讨论
陆丰数据局数据库
服务器中已存在服务
当前网络安全风险问题
在创建弹性云服务器的时候
可以自定义交易软件开发
体制改革下的网络安全
华为手机云服务器异常
如何让网络不连接到服务器
怎么看服务器端口ip
天龙八部打开没有服务器列表
博雅数据库江苏高校投档线
中控怎么修改数据库
先进科技 cad软件开发
服务器没有接收到您的证书
信息通信网络安全规划
腾讯云的数据库密码
服务器怎么开通第二个用户
网络安全法硬笔书法
数据库搭建多少台集群
qq聊天数据库
镇开展网络安全教育宣传培训总结
网络安全整改期限
海康监控平台软件开发语言
湖南好的电脑软件开发
互联网科技基金怎么选
Cad多段线数据库
无线传感网络技术读后感
网络安全管理的隐患有