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 存储过程给他判定为真导致的。命名不要和表字段重名。可能导致未知的奇葩问题。