更新触发器..没有按预期工作?

Posted

技术标签:

【中文标题】更新触发器..没有按预期工作?【英文标题】:Update Trigger.. Not Working as intended? 【发布时间】:2014-04-19 00:54:04 【问题描述】:

我正在学习如何在 mysql 中构建触发器,我已经构建了一个触发器,如果​​部门员工之一被更新(他们的工资被更新或者他们被添加到部门/从部门中删除),它将重新计算部门工资。如果我更新用户的工资,它也不会更新部门工资。

员工表:

SSN
Salary
Name
Dno
Supervisor_ssn

部门表:

DName
Dno
Total_sal
Manager_SSN

触发器如下:

DELIMITER $$
CREATE TRIGGER `Employee_AUPD` AFTER UPDATE ON `Employee` FOR EACH ROW
BEGIN
 IF old.salary != new.salary THEN
    UPDATE department SET total_sal = total_sal - old.salary
        WHERE new.dno = department.dno;
    UPDATE department SET total_sal = total_sal + new.salary
        WHERE new.dno = department.dno;
 END IF;
 IF old.dno != new.dno THEN
    UPDATE department SET total_sal = total_sal - old.salary
        WHERE old.dno = department.dno;
    UPDATE department SET total_sal = total_sal + new.salary
        WHERE new.dno = department.dno;
 END IF;
END;
DELIMITER;

【问题讨论】:

在这里为我工作:sqlfiddle.com/#!2/1426e/3 我正在更新的记录中 Salary 和 Dno 的值为 NULL,我想知道这是否与它有关。就像你说的,它非常适合没有 NULL 值的记录。 阅读:***.com/questions/6999295/…(您应该在问题中包含空值)。 【参考方案1】:

你有一个逻辑错误。如果工资部门发生变化,第一个 IF 块从新部门中减去旧工资。

但是你不需要测试任何东西。只需编写这两个更新语句:

UPDATE department SET
total_sal = total_sal - old.salary
WHERE department.dno = old.dno;

UPDATE department SET
total_sal = total_sal + new.salary
WHERE department.dno = new.dno;

这个逻辑很简单,不会失败。

【讨论】:

以上是关于更新触发器..没有按预期工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个分配不触发?

Promise then() 方法没有按预期触发? [复制]

效果不触发任何动作?

Windows Phone:警报类未按预期触发

e.PreventDefault()未按预期触发,表单提交[重复]

更新底层 SQL 表时如何在 Access 中触发 VBA 代码?