MYSQL触发器 - 如何存储计算字段的结果

时间:2012-04-14 06:52:10

标签: mysql triggers

我正在使用MySQL 5.5。我需要使用mysql触发器语法向我的表添加一个Trigger:http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html

他们给出的例子没有解释我如何做到这一点 -

我有一张桌子 - table(a INT, b INT, c INT);。字段ab是数字,而字段c应为a + b。现在我确定你想知道为什么不在视图中拍打它并完成它,或者为什么不把它放在我的代码中。原因是因为我正在与需要自动计算字段的便利性的客户一起工作,能够修改它需要变化的值。他们是一家审计公司,由于公司缺少审计日期等,通常需要按摩这些数字。

那么如何创建一个触发器:

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的价值,如果它已经手动输入,并且如果没有手动触摸它就进行爆破。

谢谢!

1 个答案:

答案 0 :(得分:0)

我知道这是一个老问题,但如果仍然需要答案,那就是。

首先,为了获得更多直接更新,已经在表中添加了一个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 演示