【MySQL】外键约束和外键策略

这篇具有很好参考价值的文章主要介绍了【MySQL】外键约束和外键策略。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、什么是外键约束?

        外键约束FOREIGN KEY,缩写FK)是用来实现数据库表的参照完整性的。外键约束可以使两张表紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性。
        外键是指表中某个字段的值依赖于另一张表中某个字段的值,而被依赖的字段必须具有主键约束或者唯一约束。被依赖的表我们通常称之为父表或者主表,设置外键约束的表称为子表或者从表。

二、外键约束示例

        如果想要表示学生和班级的关系,首先要有学生表和班级表两张表,然后学生表中有个字段为stu_class(该字段表示学生所在的班级),而该字段的取值范围由班级表中的主键cla_no字段(该字段表示班级编号)的取值决定。那么班级表为主表,学生表为从表,且stu_class字段是学生表的外键。通过stu_class字段就建立了学生表和班级表的关系。

【MySQL】外键约束和外键策略

如果这样设计学生表,有以下两个缺点:

  • 缺点一:数据重复
  • 缺点二:修改班级数据时,需要更改多条记录

【MySQL】外键约束和外键策略

可以这样来设计学生表:

【MySQL】外键约束和外键策略

以上,

班级表被称为父表,班级编号是它的主键

学生表被称为子表,班级名称是它的外键

三、外键约束的SQL展示

1、子表依赖父表,因此,先创建父表:

create table t_class(
	cno int(4) primary key auto_increment,
	cname varchar(10) not null,
	room char(4)
);

【MySQL】外键约束和外键策略

2、为表class添加数据:

insert into t_class values (null,'Python一班','r803');
insert into t_class values (null,'Python二班','r416');
insert into t_class values (null,'Java一班','r103');

【MySQL】外键约束和外键策略

3、创建子表:学生表t_student

创建外键时,列名可以不一样,但是列类型及其长度最好与主键保持一致。

create table t_student(
	sno int(6) primary key auto_increment,
	sname varchar(5) not null,
	classno int(4)
);

4、添加学生信息

insert into t_student values (null,'张三',1);
insert into t_student values (null,'李四',1);
insert into t_student values (null,'王五',1);

【MySQL】外键约束和外键策略

5、将主表和从表关联起来

需要添加外键约束,外键约束只有表级约束,没有列级约束。

为子表t_student添加外键约束,指定约束名为fk_stu_classno,将t_student的外键classno和t_class的主键cno关联起来:

alter table t_student add constraint fk_stu_classno foreign key (classno) references t_class (cno);

6、测试是否关联成功

目前,学生表如下:

【MySQL】外键约束和外键策略

班级表如下:

【MySQL】外键约束和外键策略

测试一:将t_class表中班级1删除

预期结果:应该是无法删除的,因为和班级表关联的学生表中,有同学在班级1中,删除班级2、3应该是可以的,因为学生没有2班和3班的;

delete from t_class cno=1;

执行返回1451错误:

> 1451 - Cannot delete or update a parent row: a foreign key constraint fails (`database_me`.`t_student`, CONSTRAINT `fk_stu_classno` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))

因为受到了外键约束的影响。

测试二:删除班级2

【MySQL】外键约束和外键策略

成功删除了。

测试三:在学生表中添加一条数据,这位同学是3班的,然后尝试是否可以删除班级3

insert into t_student values (null,"老六",3);

【MySQL】外键约束和外键策略

删除班级3:

delete from t_class where cno=3;

此时,会返回1451错误,主键已经被外键约束了。

测试四:为设有外键的子表添加一个班级为4的同学

insert into t_student values (null,"小七",4);

返回1452错误:

> 1452 - Cannot add or update a child row: a foreign key constraint fails (`database_me`.`t_student`, CONSTRAINT `fk_stu_classno` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))

因为主表中没有班级4。

四、删除主/从表

需要先删除从表,后删除主表,否则无法删除。

先删除主表会返回如下错误:

> 3730 - Cannot drop table 't_class' referenced by a foreign key constraint 'fk_stu_classno' on table 't_student'.

【MySQL】外键约束和外键策略

五、外键策略

因为部分操作致使班级表和学生表数据混乱,现在重新创建这两张表来进行下面的演示。

【MySQL】外键约束和外键策略【MySQL】外键约束和外键策略

需求:希望删除班级2

但是直接删除是删不了,因为有外键约束,我们可以考虑加入外键策略

1、策略1: no action 不允许操作

【MySQL】外键约束和外键策略

可以先将班级为2的同学的班级编号改为null

update t_student set classno=null where classno=2;

【MySQL】外键约束和外键策略

再删除 

delete from t_class where cno=2;

【MySQL】外键约束和外键策略

2、策略2:cascade级联操作:操作主表的时候影响从表的外键信息。

没有添加级联操作之前,尝试更新班级号:

update t_class set cno=5 where cno=3;

返回1451错误:

> 1451 - Cannot delete or update a parent row: a foreign key constraint fails (`database_me`.`t_student`, CONSTRAINT `fk_stu_classno` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))

使用cascade级联操作,需要先删除之前的外键约束:

alter table t_student drop foreign key fk_stu_classno;

再重新添加外键约束:

alter table t_student
    add constraint fk_stu_classno
        foreign key (classno) references t_class (cno)
            on update cascade on delete cascade
;

on update cascade on delete cascade表示在进行更新和删除时都会有级联操作。

再尝试更新班级号:

update t_class set cno=5 where cno=3;

【MySQL】外键约束和外键策略

试试删除操作,删除班级编号为5的班级,删除之前,可以看见,学生表中有5班的同学:

【MySQL】外键约束和外键策略

班级表中删除5班:

delete from t_class where cno=5;

查看班级表:

【MySQL】外键约束和外键策略

再看学生表:

【MySQL】外键约束和外键策略

由此可见,级联操作主表变动时,从表数据也会随之改变。级联操作要慎用,它对生产库影响较大。

3、策略3:set null 置空操作

删除之前的外键约束:

alter table t_student drop foreign key fk_stu_classno;

添加新外键约束,使用外键策略的置空操作:


alter table t_student add constraint 
	fk_stu_classno foreign key (classno) references t_class (cno) 
		on update set null on delete set null
		;	

尝试更新班级表班级编号:

update t_class set cno=8 where cno=1;

查看班级表:

【MySQL】外键约束和外键策略

查看学生表:

【MySQL】外键约束和外键策略

策略2的级联操作和策略3的置空操作可以混合使用,如为更新操作添加的是级联操作,为删除操作添加的是置空操作:

alter table t_student add constraint
	fk_stu_classno foreign key (classno) references t_class (cno)
		update cascade on delete set null
		;

两者的应用场合有所不同,例如:

删除朋友圈时,下面的评论也会一起删除,那么朋友圈的删除操作就可以使用级联操作;

解散班级时,班级的同学依然存在,可以将同学的班级信息置为空,因为后续会为同学分配新的班级,那么解散班级操作就可以添加置空操作。文章来源地址https://www.toymoban.com/news/detail-438466.html

到了这里,关于【MySQL】外键约束和外键策略的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL外键约束和多表查询

    知识点 示例 知识点 示例 准备数据 示例 知识点 示例 知识点 示例

    2024年02月04日
    浏览(51)
  • MySQL--删除表的外键约束,简单易懂。

    删除表的外键约束 我们曾在第一章中讲过外键的作用,以及如何创建一个表的外键。建立了外键我们就建立起了两张表的关联关系,那如果我想删除主表呢?为了确保数据库的正确性,我们必须先解除两个表之间的关联关系,那就是删除外键约束啦!让我们先来看看删除外键

    2024年04月17日
    浏览(29)
  • 一文彻底搞清楚MySQL的主键、外键、约束和各种索引

    主键用于唯一标识表中每一行数据,外键用于建立表与表之间关联关系,约束用于限制表中数据的规则,索引用于加速查询。 主键是一种用于唯一标识表中每一行数据的标识符。在Mysql中,主键可以是一个或多个列的组合,但是必须满足以下条件: 主键列的值必须唯一,不能

    2024年02月08日
    浏览(30)
  • 使用MySQL建立外键约束时,报错3780的问题分析,和解决办法

    今天在用语句给两个表建立外键约束时,报了3780的错误–具体描述如下: 大概意思就是或说,主表和从表的create_use 和 user_id 两个字段这不兼容 经过一顿分析之后发现,是因为这两个表的这两列数据类型不一样 解决办法–修改表中的数据类型(在这里使用的是Navicat可视化界

    2024年01月22日
    浏览(27)
  • 【MySQL】MySQL表的约束-空属性/默认值/列属性/zerofill/主键/自增长/唯一键/外键

    表的约束:表中一定要有各种约束,通过约束,让我们未来插入数据库表中的数据是符合预期的。约束的本质是通过计数手段,倒逼程序员,插入正确的数据,反过来,站在mysql的视角,凡是插入进来的数据,都是符合约束的 约束的最终模板:保证数据的完整性和可预期性

    2024年02月01日
    浏览(34)
  • 主键和外键的含义及区别

    表中经常有一个列或多个列的组合,其值能唯一的标识表中的每一行。这样的一列或多列称为表的主键。 外键:用来表示表与表之间联系,是表中的一个列。 主键和外键都是用于维护数据库完整性的一种机制。 1、主键是唯一标识一条记录,不能重复,不允许为空;而外键可

    2024年02月12日
    浏览(28)
  • SQL语句中的主键和外键

    1.1)主键字段定义: 在数据库表中,如果有一组字段能够 唯一 确定一条记录,则可以把它们设计成表的主键字段。 例子:如果要创建一个人的信息表( 字段 :姓名,年龄,籍贯,工作单位......),那么身份证号是唯一能确定你这个人的,所以身份证号是主键。 1.2) 创建:

    2023年04月08日
    浏览(28)
  • MySQL---多表联合查询(上)(多表关系、外键约束、学生成绩多表关系、交叉连接查询)

    1. 多表关系 MySQL 多表之间的关系可以概括为: 一对一:        比如:一个学生只有一张身份证;一张身份证只能对应一学生。        实现原则:在任一表中添加唯一外键,指向另一方主键,确保一对一关系。         一般一对一关系很少见,遇到一对一关系的表最好是

    2024年02月05日
    浏览(43)
  • SQL语句 -非空约束 - 唯一约束 - 主键约束 - 默认约束 -外键约束

    约束的概念 : 约束是作用于表中列上的规则,用于限制加入表的数据 约束的存在保证了数据库中数据的正确性、有效性和完整性 约束的分类如下 : 约束名称 描述 非空约束 保证列中所有数据不能有null值 NOT NULL 唯一约束 保证列中所有数据各不相同 UNIQUE 主键约束 主键

    2024年01月16日
    浏览(76)
  • 错误 1452:无法添加或更新子行:外键约束失败

    #1452 - Cannot add or update a child row: a foreign key constraint fails (`goaread`.`views`, CONSTRAINT `views_ibfk_1` FOREIGN KEY (`source_id`) REFERENCES `blogs` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) 报错的原因大概分为三种: 1)原因一: 添加的外键列与另一个表的唯一索引列(一般是主键)的数据类型不同 2)原

    2024年02月05日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包