假如一门课程可以有多门直接先修课,并且在向Score表中新增一条选课记录时,要考虑是否已完成所有先修课程。此外,还常常要查询某一门课程的所有先修课程有哪些。针对以上需求,你认为应该如何修改表的设计?
时间: 2024-03-16 21:46:37 浏览: 29
针对这种情况,可以考虑将先修课程的关系抽象成一张新的表,例如 "Prerequisites" 表。该表中可以存储每门课程的所有先修课程,以及先修课程的完成状态。可以使用如下的表结构:
```
Prerequisites (
Cno INT, -- 课程编号
PCno INT, -- 先修课程编号
Status INT -- 完成状态,0 表示未完成,1 表示已完成
);
```
对于新增选课记录时的判断,可以先查询该课程的所有先修课程,再逐个判断学生是否已完成。如果未完成,则不能新增选课记录。
对于查询某一门课程的所有先修课程,可以使用如下的 SQL 语句:
```
SELECT C.Cname AS CourseName, P.PCno AS PrerequisiteCourseNo, CP.Cname AS PrerequisiteCourseName
FROM Courses_8208210915 C
JOIN Prerequisites P ON C.Cno = P.Cno
JOIN Courses_8208210915 CP ON P.PCno = CP.Cno
WHERE C.Cno = '要查询的课程编号';
```
其中,将 "要查询的课程编号" 替换为要查询的课程的编号即可。该查询语句可以返回指定课程的所有先修课程编号和名称。
相关问题
在课程表Courses_8208210915上定义一个触发器,当向表中新增一条记录时,自动在选修表Score_8208210915中为部分学生生成对该门课程的选修记录,成绩为随机生成的整数,范围在0-100之间。
以下是一段 SQL 代码,可以在课程表 `Courses_8208210915` 上定义一个触发器,当向表中新增一条记录时,自动在选修表 `Score_8208210915` 中为部分学生生成对该门课程的选修记录,成绩为随机生成的整数,范围在 0-100 之间:
```sql
-- 创建触发器
CREATE TRIGGER trg_insert_course
ON Courses_8208210915
AFTER INSERT
AS
BEGIN
DECLARE @Cno INT, @Score INT, @Sno INT;
SELECT @Cno = Cno FROM inserted;
SELECT TOP 10 @Sno = Sno FROM Students_8208210915 ORDER BY NEWID();
SET @Score = ABS(CHECKSUM(NEWID())) % 101; -- 生成一个 0~100 之间的随机数作为成绩
INSERT INTO Score_8208210915 (Sno, Cno, Score) VALUES (@Sno, @Cno, @Score);
END;
```
在上述 SQL 代码中,创建了一个名为 `trg_insert_course` 的触发器,该触发器在表 `Courses_8208210915` 中插入一条记录之后执行。使用 `DECLARE` 语句定义了三个变量 `@Cno`、`@Score` 和 `@Sno`,分别用于存储新增的课程编号、生成的随机成绩以及被选修的学生编号。使用 `SELECT @Cno = Cno FROM inserted` 语句获取新增的课程编号。使用 `SELECT TOP 10 @Sno = Sno FROM Students_8208210915 ORDER BY NEWID()` 语句获取 10 个随机的学生编号。使用 `SET @Score = ABS(CHECKSUM(NEWID())) % 101` 生成一个 0~100 之间的随机数作为成绩。最后使用 `INSERT INTO Score_8208210915 (Sno, Cno, Score) VALUES (@Sno, @Cno, @Score)` 向选修表中插入选修记录。注意,这里只为 10 个学生生成选修记录,如需更改生成记录的数量,可以修改 `TOP 10` 的值。
对Course1表建立触发器,保证删除一门课程时,同步删除该门课程的所有选课记录。用SQL语句验证此触发器
可以使用下面的 SQL 语句创建触发器来保证删除一门课程时,同步删除该门课程的所有选课记录:
```sql
CREATE TRIGGER delete_course
AFTER DELETE ON Course1
FOR EACH ROW
BEGIN
DELETE FROM CourseSelection1 WHERE course_id = OLD.course_id;
END;
```
这个触发器将在每次删除 Course1 表中的一条记录时执行。对于每条被删除的记录,它会在 CourseSelection1 表中删除所有该课程的选课记录。
为了验证这个触发器是否生效,可以尝试删除 Course1 表中的一门课程,例如:
```sql
DELETE FROM Course1 WHERE course_id = 1234;
```
如果触发器生效,那么该删除语句会删除 Course1 表中的记录,并且同时删除 CourseSelection1 表中所有该课程的选课记录。可以进一步查询 CourseSelection1 表来验证触发器是否生效:
```sql
SELECT * FROM CourseSelection1 WHERE course_id = 1234;
```
如果触发器生效,那么该查询语句应该返回空结果集,因为该课程的选课记录已被删除。
相关推荐
![text/plain](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)