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字段值无从参考,就出现了违反参照完整性的情况。因此,必须对参照完整性进行检查,以保证两个表的相容性。
当出现上图中给出的违背参照完整性规则的情况时,数据库管理系统就需要根据不同的策略执行相应的处理。一般有如下几种规则:
(2)级联(CASCADE)操作
当删除/修改父表B中的某一条记录,导致子表A的某一条或者几条记录不一致时,同时删除/修改子表A中所有不一致的若干条记录。
(3)设置为空值(SET NULL)
当删除/修改父表B中的某一条记录,导致子表A的某一条或者几条记录不一致时,就将子表A中所有不一致的若干条记录中的creator字段设置为空-null。
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设置字段外键/参照完整性约束也是在创建数据表的时候指定的,只需将创建数据表的选项卡切换至“外键”,按照上述原理进行指定即可。当然,具体如何指定,还需要根据具体的应用场景来确定。