Alex_McAvoy

想要成为渔夫的猎手

SQL 参照完整性

【参照完整性定义】

在 SQL 中,关系模型的参照完整性在 CREATE TABLE 中用 FOREIGN KEY 短语定义哪些列为外码,用 REFERENCES 短语指明这些外码参照哪些吗的主码

例如,关系 sc 中一个元组表示一个学生选修的某门课程的成绩,其中 Sno、Cno 为主码,用分别参照引用 student 表的主码和 course 表的主码

1
2
3
4
5
6
7
8
CREATE TABLE sc (
Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno, Cno),
FOREIGN KEY(Sno) REFERENCES student(Sno),
FOREIGN KEY(Cno) REFERENCES course(Cno)
);

【参照完整性检查与违约处理】

可能破坏参照完整性的情况

参照完整性将两个表中的相应元组联系了起来,因此,对被参照表和参照表进行增、删、改操作时,可能破坏参照完整性,必须进行检查以保证这两个表的相容性

以 student 表和 sc 表为例,可能破坏参照完整性的情况及违约处理如下

违约处理

当出现破坏参照完整性的情况时,系统可采用以下策略进行处理:

  • 拒绝执行 NO ACTION:不允许执行该操作执行,一般设为默认策略
  • 级联 CASCADE:删除或修改参照表的一个元组导致与被参照表不一致时,删除或修改参照表中所有导致不一致的元组
  • 设为空值 NULL:删除或修改被参照表的一个元组造成不一致时,将参照表中所欲造成不一致的元组的对应属性设为空值

需要注意的是,对于参照完整性,除了定义外码,还应定义外码列是否允许空值

实例

显示说明参照完整性的违约处理示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE sc (
Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL
Grade SMALLINT
PRIMARY KEY(Sno,Cno),
FOREIGN KEY(Sno) REFERENCES Student(Sno)
ON DELETE CASCADE, /*级联删除sc表中相应的元组*/
ON UPDATE CASCADE/*级联更新sc表中相应的元组*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
/*当删除course表中的元组造成了与sc表不一致时拒绝删除*/
ON DELETE NO ACTION,
/*当更新course表中的cno时,级联更新sc表中相应的元组*/
ON UPDATE CASCADE,
);
感谢您对我的支持,让我继续努力分享有用的技术与知识点!