mysql存储过程和触发器 --- 一次很有意思的尝试

时间:2021-04-11 05:03:44
员工表 Employees
ID money, 根据需要自己在添加字段来完成
销售业绩表 Salys
 SID money 根据需要自己在添加字段来完成
关系是一个员工对应多个销售业绩
完成对这两个表的增删改查
当员工业绩达到10000时,系统自动锁定(员工今年的销售业绩优秀)
未达到10000的(员工信息表现一般或不及格)
(最好用触发器和存储过程)


网上看到这个题目,感觉很好玩,就自己试了一下。

用了一个多小时解决掉了,但是中途一个问题就用了快一个小时。感觉很有意思。


首先 建2张表,扩充字段。

DROP TABLE IF EXISTS `employees`;
CREATE TABLE `employees` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `money` int(11) NOT NULL,
  `status` varchar(8) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


员工表增加一个状态。


DROP TABLE IF EXISTS `salys`;
CREATE TABLE `salys` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sid` int(11) NOT NULL,
  `money` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8;


销售表和员工表进行关联,多对一的关联。


然后多销售表建立触发器,自己建的是对新增数据进行触发。

DROP TRIGGER IF EXISTS t_afterinsert_on_Salys;
CREATE TRIGGER t_afterinsert_on_Salys 
AFTER INSERT ON Salys
FOR EACH ROW
BEGIN
   call p_parse(new.sid); 
END;


触发调用存储过程,把新增的数据的员工id传到存储过程中。


然后建立存储过程:


DROP PROCEDURE IF EXISTS `p_parse`;
CREATE PROCEDURE p_parse(IN UID int)
BEGIN
 DECLARE cnt int DEFAULT 0;
    select sum(money) into cnt from Salys where sid = UID;
if(cnt>10000)then
                update Employees set status ='优秀' where id = UID;
else
update Employees set status ='及格' where id = UID;
   end if;
END;


最后进行测试:

insert into Salys(sid , money) VALUES(1,20000)


测试ok。


第一次写存储过程的时候入参参数定义为SID。然后测试的时候,发现当总额达标以后,后续其他数据只要有新增就更新成功。相应的统计sql在本地运行都可以。放到存储过程中一只统计了所有员工的总额,不是当前员工的总额。后续设置别名发现成功了,然后入参的名称修改一下也成功了。

具体原因没有深究,应该是判断条件sid=SID 存储过程给他判定为真导致的。命名不要和表字段重名。可能导致未知的奇葩问题。