触发器实验(mysql)
某员工信息管理系统中,当员工入职、离职、调动部门或工资变动时,需将变动信息记入变动历史中,请使用触发器完成此功能。变动历史包含部门变动历史和工资变动历史,分别使用部门变动历史表和工资变动历史表记录对应信息。
参考表结构如下:
1.员工表
employee(empid,empname,dept,salary)
其中empid为员工编号,empname为员工姓名,dept为所在部门,salary为工资。
2.部门变动历史表
dept_history(dhid, empid, olddept, newdept, uptime)
其中dhid为部门变动编号(自动增长,无需赋值),empid为员工编号,olddept为调动前的部门(新入职的员工olddept值记为NULL),newdept为调动后的部门,uptime为修改时间。
3.工资变动历史表
sal_history(shid, empid, oldsal, newsal, uptime)
其中shid为工资变动编号(自动增长,无需赋值),empid为员工编号,oldsal为变动前的工资,newsal为变动后的工资,uptime为修改时间。
触发器要求如下:
1.当新职工入职时,员工信息表将插入1条数据。同时,触发器在部门变动历史中增加1条记录,其中olddept值为null;在工资变动历史中增加1条记录,其中oldsal值为0。
2.当员工离职时,员工信息表将删除1条数据。同时,触发器在工资变动历史中增加1条记录,其中newsal值为0;在部门变动历史中增加1条记录,其中newdept值为null;。
3.当新职工部门或工资发生变化时,触发器执行以下操作。若部门发生变动,则在变动历史中增加1条记录;若工资发生变动,则在工资变动历史中增加1条记录。
1:
新建一个stu_course数据库(名字没有要求,我用的以前的数据库写的):
CREATE DATABASE stu_course DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
讯享网
创建员工表:
讯享网use stu_course;//创建表前一定要先使用这个数据库 CREATE TABLE employee ( empid VARCHAR(20) PRIMARY KEY, -- 员工编号;在列级定义主码empid empname VARCHAR(20), -- 员工姓名 dept VARCHAR(20), -- 所在部门 salary INT -- 工资 );
创建部门变动历史表:

CREATE TABLE dept_history ( dhid INT auto_increment PRIMARY KEY, -- 部门变动编号(自动增长,无需赋值) empid VARCHAR(20), -- 员工编号 olddept VARCHAR(20), -- 调动前的部门(新入职的员工old值记为NULL) newdept VARCHAR(20), -- 调动后的部门 uptime DATETIME-- 修改时间 );

创建工资变动历史表:
讯享网CREATE TABLE sal_history ( shid INT auto_increment PRIMARY KEY, -- 工资变动编号(自动增长,无需赋值) empid VARCHAR(20), -- 员工编号 oldsal INT, -- 变动前的工资 newsal INT, -- 变动后的工资 uptime datetime -- 修改时间 );

DELIMITER $ CREATE TRIGGER emp_insert AFTER INSERT ON employee FOR EACH ROW BEGIN INSERT INTO dept_history(empid,olddept,newdept,uptime) VALUES(new.empid,null,new.dept,NOW()); INSERT INTO sal_history(empid,oldsal,newsal,uptime) VALUES(new.empid,0,new.salary,NOW()); END$ DELIMITER ;
然后向表中插入数据验证一下
讯享网INSERT INTO employee VALUES('001','朱嘉顺','策划部',6000); INSERT INTO employee VALUES('002','程文扬','信息部',7000); INSERT INTO employee VALUES('003','刘朝阳','销售部',8000); INSERT INTO employee VALUES('004','徐鹏彪','宣传部',9000);


2.
DELIMITER $ CREATE TRIGGER emp_delete AFTER DELETE ON employee FOR EACH ROW BEGIN INSERT INTO dept_history(empid,olddept,newdept,uptime) VALUES(old.empid,old.dept,null,NOW()); INSERT INTO sal_history(empid,oldsal,newsal,uptime) VALUES(old.empid,old.salary,0,NOW()); END$ DELIMITER ;
然后写一个删除测试一下:
讯享网DELETE FROM employee WHERE empid='001';



3.
DELIMITER $ CREATE TRIGGER emp_update AFTER UPDATE ON employee FOR EACH ROW BEGIN IF(new.dept!=old.dept) THEN INSERT INTO dept_history(empid,olddept,newdept,uptime) VALUES(new.empid,old.dept,new.dept,NOW()); END IF; IF(new.salary!=old.salary) THEN INSERT INTO sal_history(empid,oldsal,newsal,uptime) VALUES(new.empid,old.salary,new.salary,NOW()); END IF; END$ DELIMITER ;
验证一下:(这个是两个验证,分两次运行)
讯享网UPDATE employee SET dept='技术部' WHERE empid='002'; UPDATE employee SET salary=6000 WHERE empid='004';




以上就是这个触发器所有的实验步骤了。觉得写的还可以的话,给个关注。(●°u°●) 」

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/59148.html