2

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

他们给出的例子并没有解释我该如何去做——

我有一张桌子 - table(a INT, b INT, c INT);。fieldab是数字,而 fieldc应该是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手动输入的值,如果没有手动触摸,则将其爆破。

谢谢!

4

1 回答 1

2

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

首先,为了进行更直接的更新,表中添加了一个 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;

结果我们有

| 身份证 | 一个 | 乙| C |
--------------------
| 1 | 1 | 2 | 3 | -- 在插入时计算
| 2 | 3 | 4 | 25 | -- 在更新时显式设置
| 3 | 5 | 6 | 11 | -- 更新时重新计算
| 4 | 7 | 8 | 100 | -- 在插入时显式设置

这是SQLFiddle演示

于 2013-08-02T04:50:30.437 回答