我使用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
。 现在,我敢肯定你想知道为什么不拍这个在视图中,并用它做,或者为什么不把这个在我的代码。 究其原因是因为我与需要自动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
如果已经手工录入,炸开它,如果它尚未手动感动。
谢谢!
我知道这是一个老问题,但如果仍然在这里所需要的答案是。
首先一个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演示