创建触发器sc_delete,当删除student表中的一条学生记录时,自动删除score表中对应学生的选课记录
时间: 2024-03-28 18:40:02 浏览: 287
可以使用如下的 SQL 语句创建一个名为 `sc_delete` 的触发器,实现删除学生表中学生记录时自动删除 score 表中对应学生的选课记录:
```
CREATE TRIGGER sc_delete
AFTER DELETE ON student
FOR EACH ROW
BEGIN
DELETE FROM score WHERE student_id = OLD.student_id;
END;
```
这里使用了 `AFTER DELETE` 指示器,表示在删除操作执行后触发该触发器。`FOR EACH ROW` 表示在每一行删除操作完成后都会执行触发器中的代码。`OLD.student_id` 表示被删除的学生记录中的学号(即旧的学号),这个学号将被用来删除 score 表中对应学生的选课记录。具体来说,`DELETE FROM score WHERE student_id = OLD.student_id` 表示删除 score 表中学号为 `OLD.student_id` 的记录,即被删除的学生对应的选课记录。
相关问题
(1)在两个表间建立为维护参照完整性使用的级联删除触发器、级联修改触发器和受限插入触发器。 (2)建立一个学生选课数不超5门的触发器; (3)建立一个触发器,教授工资不得低于4000元,若低于4000,自动改为4000元。 (4)建立一个触发器,当对表SC的grade属性修改时,若分数增加了10%,则将此次操作记录到另一个表SC_U(sno,cno,Oldgrade,Newgrade)中,其中Oldgrade修改前的分数,Newgrade修改后的分数。
(1)建立级联删除触发器:
```
CREATE TRIGGER tr_del_course
ON course
FOR DELETE
AS
BEGIN
DELETE FROM score WHERE cno IN (SELECT cno FROM deleted)
END
```
```
CREATE TRIGGER tr_del_student
ON student
FOR DELETE
AS
BEGIN
DELETE FROM score WHERE sno IN (SELECT sno FROM deleted)
END
```
建立级联修改触发器:
```
CREATE TRIGGER tr_update_course
ON course
FOR UPDATE
AS
BEGIN
UPDATE score SET cno = inserted.cno WHERE cno IN (SELECT cno FROM deleted)
END
```
```
CREATE TRIGGER tr_update_student
ON student
FOR UPDATE
AS
BEGIN
UPDATE score SET sno = inserted.sno WHERE sno IN (SELECT sno FROM deleted)
END
```
建立受限插入触发器:
```
CREATE TRIGGER tr_insert_score
ON score
FOR INSERT
AS
BEGIN
IF (SELECT COUNT(*) FROM score WHERE sno = inserted.sno) >= 5
RAISERROR ('每个学生最多只能选5门课程!', 16, 1)
END
```
(2)建立学生选课数不超过5门的触发器:
```
CREATE TRIGGER tr_insert_score
ON score
FOR INSERT
AS
BEGIN
DECLARE @sno CHAR(10)
SET @sno = (SELECT sno FROM inserted)
IF (SELECT COUNT(*) FROM score WHERE sno = @sno) >= 5
BEGIN
RAISERROR ('每个学生最多只能选5门课程!', 16, 1)
ROLLBACK TRANSACTION
END
END
```
(3)建立教授工资不得低于4000元的触发器:
```
CREATE TRIGGER tr_update_teacher
ON teacher
FOR UPDATE
AS
BEGIN
IF EXISTS (SELECT * FROM inserted WHERE salary < 4000)
BEGIN
UPDATE teacher SET salary = 4000 WHERE tid IN (SELECT tid FROM inserted WHERE salary < 4000)
END
END
```
(4)建立当对表SC的grade属性修改时,若分数增加了10%,则将此次操作记录到另一个表SC_U(sno,cno,Oldgrade,Newgrade)中的触发器:
```
CREATE TRIGGER tr_update_score
ON score
FOR UPDATE
AS
BEGIN
DECLARE @sno CHAR(10), @cno CHAR(10), @Oldgrade DECIMAL(5,2), @Newgrade DECIMAL(5,2)
SELECT @sno = sno, @cno = cno, @Oldgrade = deleted.grade, @Newgrade = inserted.grade
FROM inserted INNER JOIN deleted ON inserted.sno = deleted.sno AND inserted.cno = deleted.cno
IF @Newgrade > @Oldgrade * 1.1
BEGIN
INSERT INTO SC_U (sno, cno, Oldgrade, Newgrade) VALUES (@sno, @cno, @Oldgrade, @Newgrade)
END
END
```
在sc表上设计一个delete触发器,当删除一个学生的课程成绩时,自动修改cg表的平均分数和课程人数,以保持数据一致性
在SQL中,你可以通过创建触发器(Trigger)来实现这样的功能。假设你有两个表,一个是`student_scores`(sc表),存储学生课程的成绩,另一个是`course_grades`(cg表),包含课程信息,如平均分和选课人数。当你需要在删除sc表上的成绩记录时,可以创建一个删除触发器来更新cg表。
首先,我们创建一个删除触发器的例子,这个触发器会在`student_scores`表上的`score_id`字段被删除时触发:
```sql
CREATE TRIGGER update_course_stats
AFTER DELETE ON student_scores
FOR EACH ROW
BEGIN
UPDATE course_grades
SET average_score = (average_score * (total_students - 1)) / total_students,
total_students = total_students - 1
WHERE course_id = OLD.course_id;
END;
```
在这个例子中:
- `AFTER DELETE ON student_scores`表示在删除`student_scores`表的行之后触发。
- `FOR EACH ROW`表示对每一行操作都会执行一次触发器内的SQL。
- `OLD.course_id`获取到被删除的学生课程ID。
- 更新`course_grades`表,根据删除的分数计算新的平均分和总人数。
注意:这是一个简化的示例,实际应用中可能需要考虑并发控制、事务管理和异常处理等问题。此外,平均分的计算可能会有浮点数精度的问题,可以根据实际情况调整。
阅读全文