设计触发器,完成以下功能: 1. student表中当删除某一同学sno时,该同学的所有选课也都要删除,设计一个触发器完成此功能 2. student表中当插入某一同学sno时,若该同学的存在,则拒绝插入并提示“此记录无效”,设计一个触发器完成此功能 3. 在学生表Student上创建一个触发器,要求在向Student中插入数据或修改数据时,学生的年龄不得小于18岁,若小于18岁则将年龄改为18岁。 4. 在课程表Course中创建一个触发器,要求在删除一条课程记录时,先检查该课程是否有被选修记录,若有则提示出错,并回滚Rollback。 5. 创建和测试触发器:向SC表插入数据时,检查插入数据的课程号是否存在于Course表中(创建之前删除Cno的外键约束,比较外键约束和触发器之间的不同)
时间: 2023-12-19 22:07:42 浏览: 188
触发器是数据库中一种特殊的存储过程,它可以在某个表上进行操作时自动执行。根据题目要求,我们可以设计以下触发器。
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的外键约束。
以上是触发器的设计和实现。在实际应用中,需要根据具体的业务需求来设计触发器,保证数据的完整性和一致性。
阅读全文