您的位置:首页 > 数据库 > MySQL

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

2017-02-08 12:08 711 查看
员工表 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 存储过程给他判定为真导致的。命名不要和表字段重名。可能导致未知的奇葩问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: