1、sc表上的插入触发器,要求一个学生最多只能选修5门课 功能:这个触发器在sc表上创建,用于在sc表中插入学生选课信息时,假如该学生选修课程超过5门,则插入失败。
时间: 2024-03-23 19:38:30 浏览: 142
可以使用以下代码创建一个在sc表上的插入触发器,实现一个学生最多只能选修5门课的要求:
```sql
CREATE TRIGGER max_course
BEFORE INSERT ON sc
FOR EACH ROW
BEGIN
DECLARE count INT;
SELECT COUNT(*) INTO count FROM sc WHERE sid = NEW.sid;
IF count >= 5 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '该学生选修课程超过5门,插入失败';
END IF;
END;
```
该触发器在每次向sc表中插入数据时都会被触发,使用SELECT COUNT(*)语句统计该学生已经选修的课程数量,如果数量大于等于5,则使用SIGNAL语句抛出异常,从而导致插入失败。
相关问题
SQLserver 建立Student(学号,年龄,性别,系名) Course(课号,课名,学分,学时) SC(学号,课号,成绩)表 1.建立学生表的insert触发器,若向学生表中插入一条记录,则自动向选课表中插入一行,令该生选一门选修人数最多的课。 2.在建立学生表的delete触发器,若选课表中该生有选课记录,则拒绝删除,要求在删除学生信息同时,将相关表中的信息全部删除。
对于第一个问题,你可以使用以下代码创建一个触发器来实现自动向选课表中插入一行:
```
CREATE TRIGGER tr_insert_student
ON Student
AFTER INSERT
AS
BEGIN
DECLARE @max_course_id INT
SELECT @max_course_id = TOP 1 Course.课号, COUNT(SC.学号) AS 选修人数
FROM Course
LEFT JOIN SC ON Course.课号 = SC.课号
GROUP BY Course.课号
ORDER BY 选修人数 DESC
INSERT INTO SC (学号, 课号, 成绩) VALUES (INSERTED.学号, @max_course_id, NULL)
END
```
这个触发器会在向学生表中插入一条记录时被激活。它会查询选课表中每门课的选修人数,并选择选修人数最多的那门课的课号。然后,它会向选课表中插入一行,将该生的学号和选择的课号插入,并将成绩设置为 NULL。
对于第二个问题,你可以使用以下代码创建一个触发器来实现在删除学生信息时将相关表中的信息全部删除:
```
CREATE TRIGGER tr_delete_student
ON Student
INSTEAD OF DELETE
AS
BEGIN
DELETE FROM SC WHERE 学号 IN (SELECT 学号 FROM DELETED)
DELETE FROM Student WHERE 学号 IN (SELECT 学号 FROM DELETED)
END
```
这个触发器会在删除学生信息时被激活。它会先从选课表中删除该生的所有选课记录,然后再从学生表中删除该生的记录。如果选课表中没有该生的选课记录,则直接从学生表中删除该生的记录。
设计触发器,完成以下功能: 1. student表中当删除某一同学sno时,该同学的所有选课也都要删除,设计一个触发器完成此功能 2. student表中当插入某一同学sno时,若该同学的存在,则拒绝插入并提示“此记录无效”,设计一个触发器完成此功能 3. 在学生表Student上创建一个触发器,要求在向Student中插入数据或修改数据时,学生的年龄不得小于18岁,若小于18岁则将年龄改为18岁。 4. 在课程表Course中创建一个触发器,要求在删除一条课程记录时,先检查该课程是否有被选修记录,若有则提示出错,并回滚Rollback。 5. 创建和测试触发器:向SC表插入数据时,检查插入数据的课程号是否存在于Course表中(创建之前删除Cno的外键约束,比较外键约束和触发器之间的不同)
触发器是数据库中一种特殊的存储过程,它可以在某个表上进行操作时自动执行。根据题目要求,我们可以设计以下触发器。
1. 删除同学选课触发器
当在student表中删除一条记录时,需要同时删除对应的选课记录。我们可以在选课表SC上创建一个触发器,在删除学生记录时自动删除对应的选课记录。触发器如下:
```sql
CREATE TRIGGER delete_sc_trigger
AFTER DELETE ON student
FOR EACH ROW
BEGIN
DELETE FROM SC WHERE SC.Sno = OLD.Sno;
END;
```
2. 拒绝插入已存在的同学记录触发器
当在student表中插入一条记录时,需要判断该同学是否已经存在。我们可以在student表上创建一个BEFORE INSERT触发器,在插入记录之前自动检查同学是否已经存在。如果存在,则拒绝插入该记录。触发器如下:
```sql
CREATE TRIGGER insert_student_trigger
BEFORE INSERT ON student
FOR EACH ROW
BEGIN
IF EXISTS(SELECT * FROM student WHERE student.Sno = NEW.Sno) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '此记录无效';
END IF;
END;
```
3. 年龄不得小于18岁触发器
当在student表中插入或修改记录时,需要判断学生的年龄是否小于18岁。如果小于18岁,则将年龄改为18岁。我们可以在student表上创建一个BEFORE INSERT和BEFORE UPDATE触发器,在插入或更新记录之前自动检查学生年龄。如果年龄小于18岁,则将年龄改为18岁。触发器如下:
```sql
CREATE TRIGGER age_trigger
BEFORE INSERT, UPDATE ON student
FOR EACH ROW
BEGIN
IF NEW.age < 18 THEN
SET NEW.age = 18;
END IF;
END;
```
4. 检查课程是否被选修触发器
当在course表中删除一条记录时,需要先检查该课程是否有被选修记录。如果有,则提示出错并回滚操作。我们可以在选课表SC上创建一个BEFORE DELETE触发器,在删除课程记录之前自动检查该课程是否有被选修记录。如果有,则提示出错并回滚操作。触发器如下:
```sql
CREATE TRIGGER check_sc_trigger
BEFORE DELETE ON course
FOR EACH ROW
BEGIN
IF EXISTS(SELECT * FROM SC WHERE SC.Cno = OLD.Cno) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '该课程有被选修记录,无法删除';
ROLLBACK;
END IF;
END;
```
5. 检查外键约束触发器
当在SC表中插入一条记录时,需要检查插入数据的课程号是否存在于Course表中。我们可以在SC表上创建一个BEFORE INSERT触发器,在插入记录之前自动检查课程号是否存在。如果不存在,则提示出错。触发器如下:
```sql
CREATE TRIGGER check_course_trigger
BEFORE INSERT ON SC
FOR EACH ROW
BEGIN
IF NOT EXISTS(SELECT * FROM course WHERE course.Cno = NEW.Cno) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '课程号不存在于Course表中';
END IF;
END;
```
注意:在创建第5个触发器之前,需要先删除SC表中Cno的外键约束。
以上是触发器的设计和实现。在实际应用中,需要根据具体的业务需求来设计触发器,保证数据的完整性和一致性。
阅读全文