【MySQL】在学习外键约束和插入新元素时必踩的坑!(阿里云可视化操作)
目录
一、参照完整性规则
1.简单的概念
⚪外键可以为空值
⚪外键的值(如果有的话)必须等于某个主键的值
⚪空值表示该外键暂未分配
⚪非空值表示外键值引用了某一主键
⚪外键是对主键的引用
2.实际操作往往遇到麻烦(注意事项)
⚪在表中变更时一定要留意与之关联的外键
⚪例如,在B表中有一个外键指向A表中的同一个属性名,如课程表中有外键学号3指向学生表中的学号3,这时在学生表中尝试单独删除这个学生的元组信息就会报错。正确的方法是先删除后者再删除前者。外键的存在使得这两个键之间存在了一定的依赖关系,导致,B中的数据不能脱离A中对应数据独立存在(有外键的情况下)。
尝试单独删除外码表对应主码的数值,

执行结果:

结果很显然,不可以做到。
所以我们先删除依赖那个主码数据的外键对应的数据:

二、以一张课程表为例
例子:一个数据库R(A,B)=课程(课程号,课程名,预修课,学分)
预修课:选修课前必须修的课程,例如:想要选修数据结构的前提是修了C语言这门课程。
编辑课程表的可视化操作如下 (阿里云服务器DMS控制台):
基本信息:

列信息:

索引信息:

外键信息:

三、新手插入数据常犯错误
根据上面给出的Course表的创建,使得插入后的表结果如下:

注意:因为这里的Cpno为一个引用Cno的外键,而在控制台上直接点击提交修改本质上也是转化为SQL语句执行的,所以相当与执行了7次Insert操作,

如果点击直接执行:

Opos!

开不开心?
这个主码和外码的依赖关系可以看作一个链表,链表的操作不可能是从中间开始的(注意这里每一条语句都是顺序执行的插入),所以从第一次插入开始就有问题了,系统并不知道先行课5在哪里,要知道第一次执行时只有一个元素。
所以我们可以按照倒序链表的形式来插入语句,确保最后一个插入不需要引用后面的未知元素,以此类推。
修改完毕:

正常执行

成功:

实际插入元素时,注意不要出现对数据表中未出现的属性值的引用即可。

浙公网安备 33010602011771号