MySQL 使用游标触发并循环更新错误值

Posted

技术标签:

【中文标题】MySQL 使用游标触发并循环更新错误值【英文标题】:MySQL trigger with cursor and loop updating the wrong values 【发布时间】:2014-11-10 09:13:30 【问题描述】:

嘿,我在另一个表上的更新触发的循环内的更新语句中设置正确值时遇到问题。

我有 2 张桌子,员工和 base_wage。基本工资是新员工将获得的标准工资。在雇员表中有一个薪水列,通常是基本工资,但有时可能高于基本工资。例如,如果一个人在某个职位上工作了很多年,那么与刚得到这份工作的人相比,他可能会获得更高的薪水。

我在 base_wage 表上创建了一个 AFTER UPDATE 触发器,它为该职位的每个员工设置了新的基本工资。触发器还应考虑到一些员工可能拥有的额外工资,并将其添加到新的基本工资之上。

触发器有效,但它不会为那些获得超过基本工资的员工增加额外的工资。

我在这里创建了一个小提琴: http://sqlfiddle.com/#!2/cfe116/1

在小提琴中,经理的基本工资是 150,我在雇员表中添加了两个经理,一个工资为 150(基本),另一个得到 170(比基本多 20)。如果我现在想将经理的基本工资更改为 160,第一个经理应该得到 160 作为工资,第二个经理应该得到他的工资(170)减去旧的基本工资(150)加上新的基本工资 = 180。 现在两位经理的薪水出于某种奇怪的原因都变为 160。

那么知道为什么这不起作用吗?我在这里错过了什么吗?

提前谢谢:)

【问题讨论】:

【参考方案1】:

问题就在这里 UPDATE employees SET salary = mTotalSalary WHERE jobTitel = OLD.position;

您正在使用职位更新员工表,它将更新具有相同职位的每个员工,并使用您需要考虑使用employeeid 的相同值。

先声明

declare empId INT;

然后将员工 id 提取到光标中

SELECT salary,employeeId FROM employees WHERE jobTitel = OLD.position;

并在声明的变量中使用

FETCH employeeCursor INTO mSalary,empId;

最后把更新命令改成

UPDATE employees SET salary = mTotalSalary WHERE employeeId = empId;

这是小提琴http://sqlfiddle.com/#!2/b4840/1

【讨论】:

以上是关于MySQL 使用游标触发并循环更新错误值的主要内容,如果未能解决你的问题,请参考以下文章

SQL游标怎么循环更新

使用显式游标和循环更新列以生成唯一值

利用mysql存储过程循环插入新数据并更新

sqlserver中游标循环中只更新当前行的方法

循环遍历带有更新字段条件的游标 [PLSQL]

Mysql光标未运行嵌套循环