Oracle根据语义为选课表(sc)的sno列和cno列建立外键,并要求级联删除(也就是当删除学生或课程表的记录时,自动删除选课表中的相应记录)。
时间: 2024-03-22 08:37:30 浏览: 23
这是一个很好的数据库设计实践。可以使用以下SQL语句为选课表(sc)的sno列和cno列建立外键,并要求级联删除:
```
ALTER TABLE sc ADD CONSTRAINT fk_sc_sno FOREIGN KEY (sno) REFERENCES student(sno) ON DELETE CASCADE;
ALTER TABLE sc ADD CONSTRAINT fk_sc_cno FOREIGN KEY (cno) REFERENCES course(cno) ON DELETE CASCADE;
```
这两条语句将在选课表(sc)的sno列和cno列上分别创建外键,这些外键将引用学生表(student)和课程表(course)的主键。ON DELETE CASCADE选项将指示数据库在删除学生或课程表中的记录时,自动删除选课表中相应的记录。
相关问题
假设表SC中有外键约束,创建触发器“T_CNO”,实现CNO的级联修改,也就是当表C的CNO修改时,表SC的CNO发生同步改变。
可以使用以下代码创建触发器:
```
CREATE TRIGGER T_CNO
ON C
AFTER UPDATE
AS
BEGIN
IF UPDATE(CNO)
BEGIN
UPDATE SC
SET CNO = inserted.CNO
FROM SC
INNER JOIN inserted
ON SC.SNO = inserted.SNO
END
END
```
这个触发器将在表C中的CNO列更新后触发。它使用INSERTED表来获取新的CNO值,并使用INNER JOIN将其与表SC中的对应行进行匹配,并更新SC表中的CNO值。
需要注意的是,这个触发器只能处理单个行的更新,如果更新操作涉及到多行,可能需要使用循环来处理每一行的更新。此外,应该谨慎使用级联更新,确保它不会破坏数据库的完整性。
在st_2中建立SC_2表,并按照SC设置学号、课程号及成绩。成绩限制在0~100分之间;Sno参照student_2表sno,并进行删除级联设置和更新级联设置;cno参照Course_2表cno,并进行更新级联设置和拒绝删除设置。
好的,根据您的要求,我给出建立SC_2表的SQL语句如下:
```
CREATE TABLE SC_2 (
Sno CHAR(10) NOT NULL,
Cno CHAR(10) NOT NULL,
Grade INT CHECK (Grade >= 0 AND Grade <= 100),
PRIMARY KEY (Sno, Cno),
FOREIGN KEY (Sno) REFERENCES student_2(Sno) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (Cno) REFERENCES Course_2(Cno) ON DELETE RESTRICT ON UPDATE CASCADE
);
```
这里使用了 `CASCADE` 和 `RESTRICT` 两种不同的外键约束,满足了您的要求。其中,`ON DELETE CASCADE` 表示当 student_2 表中的某个学生记录被删除时,对应的 SC_2 表中所有该学生的成绩记录也会被自动删除;`ON UPDATE CASCADE` 表示当 student_2 表中的某个学生记录的学号发生修改时,对应的 SC_2 表中所有该学生的成绩记录的学号也会被自动修改;`ON DELETE RESTRICT` 表示当 Course_2 表中的某个课程记录被删除时,对应的 SC_2 表中包含该课程的成绩记录不能被删除;`ON UPDATE CASCADE` 表示当 Course_2 表中的某个课程记录的课程号发生修改时,对应的 SC_2 表中所有该课程的成绩记录的课程号也会被自动修改。