创建一个级联修改触发器trigger_1,即当修改学生课程表Course中的某门课的课程号时,对应学生的选课表SC中的课程号也作修改
时间: 2024-03-05 13:53:50 浏览: 138
你的问题是关于数据库的触发器(trigger)的。下面是一个级联修改触发器的示例代码,可以满足你的需求:
```
CREATE TRIGGER trigger_1
AFTER UPDATE ON Course
FOR EACH ROW
BEGIN
UPDATE SC SET CourseNo = NEW.CourseNo WHERE StudentID = NEW.StudentID AND CourseNo = OLD.CourseNo;
END;
```
当Course表中某一行的课程号被修改时,触发器会将对应学生的选课表SC中的课程号也作出相应修改。这个触发器是一个AFTER UPDATE触发器,意味着它会在Course表中的修改操作完成之后执行。每次更新Course表中的一行时,触发器会检查是否有学生已经选过该门课程,如果有,就将学生选课表中的该门课程的课程号更新为新的课程号。
相关问题
为course表创建一个级联删除触发器:当从course中删除某课程信息,同时删除表sc中与此课程相关的选课记录
好的,下面是一个示例触发器的代码,供您参考:
```
CREATE TRIGGER delete_sc
AFTER DELETE ON Course
FOR EACH ROW
BEGIN
DELETE FROM Sc WHERE C_no = OLD.C_no;
END;
```
这个触发器会在 Course 表上进行 DELETE 操作时自动触发。在触发器中,使用 OLD 参数来访问被删除的数据行。通过将 Sc 表中与被删除课程相关的选课记录删除,即可完成级联删除的操作。
需要注意的是,触发器的行为可能会影响数据库性能,因此在使用触发器时需要谨慎考虑。
设学生管理数据库db_school,数据库内包括学生表ch_student,sch_course课程表,sch_score成绩表。请按要求写出以下SQL语句: (1) 请按要求创建数据库db_school,并创建学生表sch_student,sch_course课程表,sch_score成绩表。 (2) 请创建并调用存储过程 proc_stu, 实现通过指定的分数阈值score_t, 查询平均分成绩大于score_t的学生学号、姓名、和平均分的功能; (3) 在学生表上创建触发器 tri_stu ,实现学生表中删除学生记录时,成绩表中该学生成绩记录也被级联删除;
这是一道重复的问题,请您查看上面的回答。以下是重复回答:
(1) 创建数据库db_school,以及学生表sch_student、课程表sch_course、成绩表sch_score的SQL语句如下:
```
-- 创建数据库
CREATE DATABASE db_school;
-- 使用db_school数据库
USE db_school;
-- 创建学生表
CREATE TABLE sch_student (
stu_id INT PRIMARY KEY,
stu_name VARCHAR(20),
stu_gender VARCHAR(2),
stu_age INT,
stu_major VARCHAR(20)
);
-- 创建课程表
CREATE TABLE sch_course (
course_id INT PRIMARY KEY,
course_name VARCHAR(20)
);
-- 创建成绩表
CREATE TABLE sch_score (
stu_id INT,
course_id INT,
score FLOAT,
PRIMARY KEY (stu_id, course_id),
FOREIGN KEY (stu_id) REFERENCES sch_student(stu_id),
FOREIGN KEY (course_id) REFERENCES sch_course(course_id)
);
```
(2) 创建并调用存储过程proc_stu,实现查询平均分成绩大于指定分数阈值score_t的学生学号、姓名和平均分的功能。存储过程的SQL语句如下:
```
-- 创建存储过程
CREATE PROCEDURE proc_stu
@score_t FLOAT
AS
BEGIN
SELECT sch_student.stu_id, sch_student.stu_name, AVG(sch_score.score) AS avg_score
FROM sch_student
JOIN sch_score ON sch_student.stu_id = sch_score.stu_id
GROUP BY sch_student.stu_id, sch_student.stu_name
HAVING AVG(sch_score.score) > @score_t;
END
-- 调用存储过程
EXEC proc_stu 80;
```
这里的@score_t是存储过程的参数,用于指定平均分成绩的阈值。
(3) 在学生表上创建触发器tri_stu,实现学生表中删除学生记录时,成绩表中该学生成绩记录也被级联删除。触发器的SQL语句如下:
```
-- 创建触发器
CREATE TRIGGER tri_stu
ON sch_student
AFTER DELETE
AS
BEGIN
DELETE FROM sch_score
WHERE stu_id IN (SELECT deleted.stu_id FROM deleted);
END
```
这里的deleted是一个特殊表,它包含了刚刚被删除的记录。在触发器中,我们可以使用它来获取刚刚被删除的学生记录的学生ID,然后在成绩表中删除该学生成绩记录。这样就实现了级联删除的功能。
阅读全文