MYSQL触发器 - 如何存储计算字段的结果(MYSQL Triggers - how to sto

2019-10-16 14:58发布

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

他们给不解释我怎么能去这样做的例子 -

我有一个表- table(a INT, b INT, c INT); 。 字段ab是数值,而场c应该是a + b 。 现在,我敢肯定你想知道为什么不拍这个在视图中,并用它做,或者为什么不把这个在我的代码。 究其原因是因为我与需要自动calc'ed场的便利,以修改值柜面它需要变化的能力的客户端工作。 他们是一个审计公司和按摩的数字往往是必需的,因为公司缺少审核日期等。

所以,我怎么可以创建一个触发器,它将会:

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如果已经手工录入,炸开它,如果它尚未手动感动。

谢谢!

Answer 1:

我知道这是一个老问题,但如果仍然在这里所需要的答案是。

首先一个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);

一个UPDATE触发器实现根据您的要求的逻辑

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 Triggers - how to store the result of a calculated field