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

完整性约束

  • 关系模型的参照完整性
  • 参照完整性定义
  • 参照完整性检查
  • 参照完整性违约处理
  • 使用navicat设置字段外键/参照完整性约束

关系模型的参照完整性


     数据表字段的外键约束属于数据库设计—— 关系模型的参照完整性 的内容。
    关系模型的参照完整性是指:在创建表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字段值无从参考,就出现了违反参照完整性的情况。因此,必须对参照完整性进行检查,以保证两个表的相容性。

数据库完整性之参照完整性_第1张图片

参照完整性违约处理

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


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

数据库完整性之参照完整性_第2张图片

你可能感兴趣的:(MySQL,数据库,参照完整性,navicat)