我正在使用MySQL 5.5。我需要使用mysql触发器语法向我的表添加一个Trigger:http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html
他们给出的例子没有解释我如何做到这一点 -
我有一张桌子 - table(a INT, b INT, c INT);
。字段a
和b
是数字,而字段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
的价值,如果它已经手动输入,并且如果没有手动触摸它就进行爆破。
谢谢!
答案 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 演示