11.在stusys数据库中创建触发器

本文展示了如何在MySQL的stusys数据库中创建和管理各种触发器,如T_insertScoreRecord、T_insertStudentRecord、T_updateCourseScore和T_deleteStudentScore,这些触发器在表数据插入、更新和删除时自动执行特定操作。此外,还介绍了如何创建和调度事件,如E_direct和E_insertTb,用于定时执行数据库任务,以及如何重命名和删除事件。

#【例11.1】在stusys 数据库的score表创建触发器T_insertScoreRecord,当向score表插入一条记录时,显示“正在插入记录”。
use stusys;
select * from score;
delimiter //
create trigger T_insertScoreRecord before insert
    on score for each row
    begin
        set @str='正在插入记录';
    end //
delimiter ;

insert into score
    values('191007','4002',90);
select @str;
select * from score where sno='191007';
#【例11.2】 删除触发器T_insertScoreRecord。
drop trigger T_insertScordRcord;
#【例11.3】 在stusys 数据库的student表创建触发器T_inserStudentRecord,当向student表插入一条记录时,显示插入记录的学生的姓名。
use stusys;
delimiter //
create trigger T_insertStudentRecord after insert
    on student for each row
    begin
        set @str_name=new.sname;
    end //
delimiter ;
show triggers;
insert into student
    values('196007','刘莉','女','1999-01-14','通信','50');
select @str_name;
#【例11.4】在stusys数据库的course表创建一个触发器T_updateCourseScore,当更新表course中某门课程的课程号时,同时更新score表中所有相应的课程号。
use stusys;
select * from course;
set sql_safe_updates=0;
delimiter //
create trigger T_updateCourseScoreafter after update
    on course for each row
    begin
        update score set cno=new.cno where cno=old.cno;
    end //
delimiter ;
update course set cno='1111' where cno='1004';
select * from course where cno='1111';
select * from score where cno='1111';
#【例11.5】 在stusys 数据库的student表创建一个触发器T_deleteStudentScore,当删除表student中某个学生的记录时,同时将score表中与该学生有关的数据全部删除。
use stusys;
delimiter //
create trigger T_deleteStudentScore after delete
    on score for each row
    begin
        delete from score where sno=old.sno;
    end //
delimiter ;
delete from student where sno='191003';
select * from score where sno='191003';
#【例11.6】创建现在立即执行的事件E_direct,执行时创建一个表tb。
show triggers;
use stusys;
delimiter //
create event E_direct
    on schedule at now()
    do
        begin
            insert into tb values(current_timestamp);
        end //
delimiter ;
show triggers;
show tables;
#【例11.7】创建事件E_insertTb,每2秒钟插入一条记录到表tb。
use stusys;
delimiter //
create event E_insertTb
    on schedule every 2 second
    do
        begin
            insert into new_table values(current_timestamp());
        end //
delimiter ;
select * from new_table;
#【例11.8】创建事件E_startDays,从第2天起,每天清空表tb,在2021年12月31日结束。
  delimiter //
  create event E_insertTb
    on schedule every 2 second
    do
    insert into tb values(current_timestamp);
  delimiter ;
#【例11.9】将事件E_startDays更名为E_firstDays。
alter event E_startDays
    rename to E_firstDays;
#【例11.10】删除事件E_firstDays。

drop event F_courseName;

### 在选课创建限制学生最多选修5门课的触发器 假设选课名为 `elective_course`,包含字段 `student_id`(学生ID)用于标识学生,以下是一个在 MySQL创建触发器的示例代码: ```sql DELIMITER // CREATE TRIGGER limit_courses_trigger BEFORE INSERT ON elective_course FOR EACH ROW BEGIN DECLARE course_count INT; SELECT COUNT(*) INTO course_count FROM elective_course WHERE student_id = NEW.student_id; IF course_count >= 5 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '每位学生最多只能选修5门课程'; END IF; END // DELIMITER ; ``` 上述代码创建了一个名为 `limit_courses_trigger` 的触发器,在向 `elective_course` 插入新记录之前触发。它会查询当前学生已经选修的课程数量,如果数量达到或超过5门,则抛出错误,阻止新记录的插入。 ### 查看 student 数据库中的触发器信息 #### MySQL 在 MySQL 中,可以通过查询 `information_schema.triggers` 系统来查看触发器信息。以下是查看 `student` 数据库中所有触发器信息的示例: ```sql SELECT * FROM information_schema.triggers WHERE TRIGGER_SCHEMA = 'student'; ``` #### SQL Server 在 SQL Server 中,可以通过 `sys.triggers` 系统视图来查看触发器信息。以下是查看 `student` 数据库中所有触发器信息的示例: ```sql USE student; SELECT * FROM sys.triggers; ``` ### 删除 student 数据库中的“学生_beforeinsert”和“选课_afterinsert”两个触发器 #### MySQL 在 MySQL 中,可以使用 `DROP TRIGGER` 语句来删除触发器。以下是删除 `student` 数据库中“学生_beforeinsert”和“选课_afterinsert”两个触发器的示例: ```sql USE student; DROP TRIGGER IF EXISTS 学生_beforeinsert; DROP TRIGGER IF EXISTS 选课_afterinsert; ``` #### SQL Server 在 SQL Server 中,同样可以使用 `DROP TRIGGER` 语句来删除触发器。以下是删除 `student` 数据库中“学生_beforeinsert”和“选课_afterinsert”两个触发器的示例: ```sql USE student; DROP TRIGGER IF EXISTS 学生_beforeinsert; DROP TRIGGER IF EXISTS 选课_afterinsert; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ALhq1008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值