数据库——触发器练习

PART 1

创建trigger_practice库
CREATE DATABASE trigger_practice DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE trigger_practice;
#准备工作:创建员工employee表、部门变动历史dept_history表,工资变动历史sal_history表
#1,创建员工employee表:

1
2
3
4
5
6
7
8
9
CREATE TABLE employee
(
 empid VARCHAR(20) PRIMARY KEY, -- 员工编号;在列级定义主码empid
 empname VARCHAR(20), -- 员工姓名
 dept VARCHAR(20), -- 所在部门
 salary INT, -- 工资
 uptime DATE, -- 修改时间
 stutus INT -- 状态(1表示在职,0表示离职)
);

#2,创建部门变动历史dept_history表

1
2
3
4
5
6
7
8
9
CREATE TABLE dept_history
(
 dhid INT auto_increment PRIMARY KEY, -- 部门变动编号(自动增长,无需赋值)
 empid VARCHAR(20), -- 员工编号
 olddept VARCHAR(20), -- 调动前的部门(新入职的员工old值记为NULL)
 newdept VARCHAR(20), -- 调动后的部门
 uptime DATE, -- 修改时间
 FOREIGN KEY (empid) REFERENCES employee(empid) #FOREIGN key定义empid为外码;REFERENCES指明这些外码参照哪些表的主码
);

#3,创建工资变动历史sal_history表

1
2
3
4
5
6
7
8
9
CREATE TABLE sal_history
(
 shid INT auto_increment PRIMARY KEY, -- 工资变动编号(自动增长,无需赋值)
 empid VARCHAR(20), -- 员工编号
 oldsal INT, -- 变动前的工资
 newsal INT, -- 变动后的工资
 uptime DATE, -- 修改时间
 FOREIGN KEY (empid) REFERENCES employee(empid)
);

PART 2

#问题一:当新职工入职时,员工信息表将插入1条数据。同时,触发器在部门变动历史中增加1条记录,其中olddept值为null;在工资变动历史中增加1条记录,其中oldsal值为0。
#1.1,创建insert触发器

1
2
3
4
5
6
7
8
9
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,new.uptime);
 INSERT INTO sal_history(empid,oldsal,newsal,uptime) VALUES(new.empid,0,new.salary,new.uptime);
END$
DELIMITER ;

#1.2,插入数据验证:

1
2
3
4
INSERT INTO employee VALUES('001','朱嘉顺','策划部',6000,'1997-08-19',1);
INSERT INTO employee VALUES('002','程文扬','信息部',7000,'1996-08-26',1);
INSERT INTO employee VALUES('003','刘朝阳','销售部',8000,'1998-01-16',1);
INSERT INTO employee VALUES('004','徐鹏彪','宣传部',9000,'1999-10-30',1);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

PART 3
#问题二:当新职工部门或工资发生变化时,触发器执行以下操作。若部门发生变动,则在变动历史中增加1条记录;若工资发生变动,则在工资变动历史中增加1条记录。
#2.1,创建update触发器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DELIMITER $
CREATE TRIGGER emp_update
AFTER UPDATE ON employee
FOR EACH ROW
BEGIN
 IF(new.dept!=old.dept OR new.stutus=0)
  THEN
   INSERT INTO dept_history(empid,olddept,newdept,uptime) VALUES(new.empid,old.dept,new.dept,new.uptime);
 END IF;
 IF(new.salary!=old.salary OR new.stutus=0)
  THEN
   INSERT INTO sal_history(empid,oldsal,newsal,uptime) VALUES(new.empid,old.salary,new.salary,new.uptime);
 END IF;
END$
DELIMITER ;

#2.2,更新数据验证:

1
2
3
4
5
6
7
8
9
UPDATE employee
SET dept=null,salary=0,uptime='2020-11-02',stutus=0
WHERE empid='001';
UPDATE employee
SET dept='技术部',uptime='2020-11-02'
WHERE empid='002';
UPDATE employee
SET salary=6000,uptime='2020-11-02'
WHERE empid='004';

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述