级联删除
2018-11-18 本文已影响1人
ProgrammingGuy
实现
级联删除(cascade delete)隶属于约束条件(constraint),因此,级联删除需要在约束条件中设置。
COURSE
为课程表,STUDENT
为学生表,ENROLLMENT
为学生选课表。COURSE
的课程号应该与ENROLLMENT
的课程号对应。STUDENT
的学生号应该与ENROLLMENT
的学生号对应。所以ENROLLMENT
的CNO
与SNO
为外键,分别与COURSE.CNO
、STUDENT.SNO
关联。
- 数据
SELECT * FROM COURSE
C601 高等数学 周振兴 NULL
C602 大学英语 王志伟 NULL
C603 数据结构 刘建平 C601
C604 操作系统 刘建平 C603
SELECT * FROM STUDENT
1101 王燕 0 20 北京 工程系 NULL
1202 李波 1 21 上海 计算机系 NULL
1203 陈建 1 19 长沙 计算机系 NULL
1303 张斌 1 22 上海 经管系 NULL
1305 张斌 0 20 武汉 经管系 NULL
SELECT * FROM ENROLLMENT
1101 C601 90
1202 C601 72
1202 C602 85
1202 C603 87
1202 C604 NULL
1203 C603 78
1203 C604 80
1305 C601 68
1305 C602 70
- 代码
ALTER TABLE COURSE
ADD PRIMARY KEY (CNO)
ALTER TABLE STUDENT
ADD PRIMARY KEY (SNO)
ALTER TABLE ENROLLMENT
ADD FOREIGN KEY (CNO) REFERENCES COURSE(CNO) ON DELETE CASCADE
ALTER TABLE ENROLLMENT
ADD FOREIGN KEY (SNO) REFERENCES STUDENT(SNO) ON DELETE CASCADE
实验
- 删除
DELETE FROM STUDENT WHERE SNO = '1305'
- 结果
SELECT * FROM STUDENT
1101 王燕 0 20 北京 工程系 NULL
1202 李波 1 21 上海 计算机系 NULL
1203 陈建 1 19 长沙 计算机系 NULL
1303 张斌 1 22 上海 经管系 NULL
SELECT * FROM ENROLLMENT
1101 C601 90
1202 C601 72
1202 C602 85
1202 C603 87
1202 C604 NULL
1203 C603 78
1203 C604 80
总结
在FOREIGN KEY
中加入ON DELETE CASCADE
可以实现级联删除,但是在执行 SQL 语句时,SQL Server 返回结果为仅有一行数据受到影响,而实际在本例中有三行数据(STUDENT
中一行,ENROLLMENT
中两行)受到影响,所以级联删除不会通知操作者其他表中是否有数据受到影响。