数据库完整性之参照完整性

关系模型的参照完整性


     数据表字段的外键约束属于数据库设计—— 关系模型的参照完整性 的内容。
    关系模型的参照完整性是指:在创建表create table的SQL语句中,用foreign key短语定义哪些列/字段作为当前数据表的外键,用references短语指明这些外键参照哪些表的主码。

参照完整性定义

    关系模型的参照完整性使用场景举例如下:     假定现在有学生表student(主键:sno)、选课表sc(主键sno、cno)、课程表course(主键:cno),那么:sc选课表的主键(sno,cno)的取值就需要参考学生表student的主键sno和课程表course的主键cno。
    那么,在创建sc表时,其SQL语句如下:
CREATE TABLE sc
	(sno CHAR(11)) NOT NULL,
	(cno CHAR(10)) NOT NULL,
	grade SMALLINT,
	#指定主键
	PRIMARY KEY(sno,cno),
	//定义参照完整性
	FOREIGN KEY (sno) REFERENCES student(sno),
	FOREIGN KEY (cno) REFERENCES course(cno)

参照完整性检查

    通过为sc表定义参照完整性,那么,sc表的主键(sno,cno)取值,就和student学生表的主键sno、course课程表的主键cno联系起来了。
    那么,合理的情况应当是:对被参照表(student或者course)、参照表(sc)执行增加、删除、修改操作时,有可能会破坏这种参照完整性规则。
    例如:当某个学生A转校或是退学,他在student表中的记录信息会被抹除,sno字段值当然也不会再存在,那么,sc选课表的主键(sno,cno)对于学生A这条记录的sno字段值无从参考,就出现了违反参照完整性的情况。因此,必须对参照完整性进行检查,以保证两个表的相容性。

在这里插入图片描述

参照完整性违约处理

    当出现上图中给出的违背参照完整性规则的情况时,数据库管理系统就需要根据不同的策略执行相应的处理。一般有如下几种规则:


    前提:现有数据表A、B,数据表A的creator字段参考了数据表B的admin字段(或者说:在创建数据表A时,指定数据表B的admin字段作为外键,与A表的creator相关联),暂时称表B为父表、表A为子表。以下策略都是在描述:当父表执行某项操作时,DBMS需要对A表执行的操作。
     (1)拒绝(NO ACTION)操作     不允许该操作进行,这也是默认处理策略。

    (2)级联(CASCADE)操作
    当删除/修改父表B中的某一条记录,导致子表A的某一条或者几条记录不一致时,同时删除/修改子表A中所有不一致的若干条记录。

    (3)设置为空值(SET NULL)
    当删除/修改父表B中的某一条记录,导致子表A的某一条或者几条记录不一致时,就将子表A中所有不一致的若干条记录中的creator字段设置为空-null。


     例如:给定规则-
    ①当删除表student中的记录时,级联删除sc表中的记录;
    ②当删除表course中的记录,并将导致SC表中的记录不一致时,拒绝执行此次删除操作;
    ③当更新表student、course中的记录时,级联更新sc表中的记录。
    则SQL语句如下,
CREATE TABLE sc
	(sno CHAR(11)) NOT NULL,
	(cno CHAR(10)) NOT NULL,
	grade SMALLINT,
	#指定主键
	PRIMARY KEY(sno,cno),
	//定义参照完整性
	FOREIGN KEY (sno) REFERENCES student(sno)
		#当删除表student中的记录时,级联删除sc表中的记录
		ON DELETE CASCADE
		#当更新表student中的记录时,级联更新sc表中的记录
		ON UPDATE CASCADE, 
	FOREIGN KEY (cno) REFERENCES course(cno)
		#当删除表course中的记录,并将导致SC表中的记录不一致时,拒绝执行此次删除操作
		ON DELETE NO ACTION
		#当更新表course中的记录时,级联更新sc表中的记录
		ON UPDATE CASCADE

使用navicat设置字段外键/参照完整性约束

    使用navicat设置字段外键/参照完整性约束也是在创建数据表的时候指定的,只需将创建数据表的选项卡切换至“外键”,按照上述原理进行指定即可。当然,具体如何指定,还需要根据具体的应用场景来确定。

在这里插入图片描述

  • 15
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是席木木啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值