MYSQL学习与实验(七)——参照性完整实验

发布于 2020-12-04  1078 次阅读


7.参照性完整实验

7.1定义

参照完整性:是指保证主关键字(被引用表)和外部关键字(引用表)之间的参照关系。它涉及两个或两个以上表数据的一致性维护。外键值将引用表中包含此外键的记录和被引用表中主键与外键相匹配的记录关联起来。在输入、更改或删除记录时,参照完整性保持表之间已定义的关系,确保键值在所有表中一致。这样的一致性要求确保不会引用不存在的值,如果键值更改了,那么在整个数据库中,对该键值的所有引用要进行一致的更改。参照完整性是基于外键与主键之间的关系。

​ 例如学生学习课程的课程号必须是有效的课程号,score表(成绩表)的外键cno(课程号)将参考course表(课程表)中主键cno(课程号)以实现数据完整性

7.2语法

7.2.1创建表时定义参照完整性

7.2.1.1列级参照完整性

列定义时加上关键字 REFERENCES ref_table_name(ref_key)

7.2.1.2表级参照完整性
7.2.1.2.1表定义时,在语句最后加上
CONSTRAINT ref_key_name FOREIGN KEY (ref_key) REFERENCES ref_table_name(ref_key)

7.2.2创建表后定义参照完整性

使用ALTER TABLE命令

7.2.3参照性定义

参照性定义=:
REFERENCES 表名 [(索引列名 … )]
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
索引列名=:
列名 [(长度)] [ASC | DESC]

7.2.4参照动作

指定这个参照动作应用哪一条语句:这里有两条相关的语句,即UPDATE和DELETE语句;
指定采取哪个动作:可能采取的动作是RESTRICT(限制)、CASCADE(级联)、SET NULL、NO ACTION和SET DEFAULT。

①RESTRICT(限制):当要删除或更新父表时,如果子表有匹配的项,拒绝对父表的删除或更新操作
②CASCADE(级联):在父表上update/delete记录时,同步update/delete掉子表的匹配记录 .
③SET NULL:在父表上update/delete记录时,将子表上匹配记录的列设为null (要注意子表的外键列不能为not null) 。如果外键列没有指定NOT NULL限定词,这就是合法的。
④NO ACTION:NO ACTION意味着不采取动作,就是如果有一个相关的外键值在被参考的表里,删除或更新父表中主要键值的企图不被允许,和RESTRICT一样
⑤SET DEFAULT:作用和SET NULL一样,只不过SET DEFAULT是指定子表中的外键列为默认值

7.3创建语句:

create table if not exists salary1(employeeID char(6) not null,income double,outcome double,foreign key(employeeID) references salary(employeeID) on delete CASCADE on update CASCADE);
在这里插入图片描述

7.4从salary表中复制数据到salary1表:

insert into salary1(employeeID,income,outcome) select employeeID,income,outcome from salary;
在这里插入图片描述

7.5删除salary表中的一行数据,再查看salary1表的内容,看看会发生什么情况

在这里插入图片描述

从表中可以发现,从salary表中删除了employeeID =10008的记录,然后发现从表salary1中EmployeeID=10008的记录也被删除了。这是因为salary1表中参照完整性的外键为EmployeeID,其参照性键并且指定了参照性动作delete和update的级别为:CASCADE(级联):在父表上update/delete记录时,同步update/delete掉子表的匹配记录。因此当表salary表中数据发生变化时,会同步到salary1表中。

7.6详细的实验资料以及指导PPT请访问笔者GitHub地址:https://github.com/LJF2402901363/database_experiment.git


繁华落尽,雪花漫天飞舞。