我正在使用 MySQL 5.5。我需要使用 mysql 触发器语法将触发器添加到我的表中:http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html
他们给出的例子没有解释我如何去做 -
我有一张表 - table(a INT, b INT, c INT);
。字段 a
和 b
是数字,而字段 c
应该是 a
+ b
.现在我确定您想知道为什么不直接在 View 中拍打它并完成它,或者为什么不把它放在我的代码中。原因是因为我正在与一个需要自动计算字段的便利的客户一起工作,并且能够在需要变化的情况下修改值。他们是一家审计公司,由于公司错过审计日期等原因,经常需要修改数字。
那么我怎样才能创建一个触发器来:
on insert:
make `c` the value of `a` + `b`.
on update:
if the value of NEW.`c`==OLD.`c` THEN
make `c` the value of `a` + `b`.
ELSE
no change
如果新值与旧值不同,更新不会改变的原因是因为这意味着他们想要修改数字,使其与实际总和略有不同。
请随意更改我的逻辑 - 我的目标是保留手动输入的 c
的值,如果没有手动输入则爆炸它。
谢谢!
最佳答案
我知道这是一个老问题,但如果这里仍然需要答案的话。
首先,为了获得更直接的更新,在表中添加了一个 id 列。
CREATE TABLE table1
(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
a INT, b INT, c INT
);
现在,在 INSERT
触发器中,逻辑已更改为允许将预先计算的值插入到 C
列。
CREATE TRIGGER tg_table1_before_insert
BEFORE INSERT ON table1
FOR EACH ROW
SET NEW.c = IF(NEW.c IS NULL, NEW.a + NEW.b, NEW.c);
更新触发器根据您的要求实现逻辑
CREATE TRIGGER tg_table1_before_update
BEFORE UPDATE ON table1
FOR EACH ROW
SET NEW.c = IF(NEW.c <=> OLD.c, NEW.a + NEW.b, NEW.c);
现在让我们做一些插入和更新
INSERT INTO table1 (a, b) VALUES (1, 2), (3, 4);
INSERT INTO table1 (a, b, c) VALUES (5, 6, 0), (7, 8, 100);
UPDATE table1 SET c = 25 WHERE id = 2;
UPDATE table1 SET c = c WHERE id = 3;
结果我们有
| ID | A | B | C | -------------------- | 1 | 1 | 2 | 3 | -- calculated on insert | 2 | 3 | 4 | 25 | -- explicitly set on update | 3 | 5 | 6 | 11 | -- re-calculated on update | 4 | 7 | 8 | 100 | -- explicitly set on insert
这是 SQLFiddle 演示
关于MYSQL 触发器 - 如何存储计算字段的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10151687/