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

标签 mysql triggers

我正在使用 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 .现在我确定您想知道为什么不直接在 View 中拍打它并完成它,或者为什么不把它放在我的代码中。原因是因为我正在与一个需要自动计算字段的便利的客户一起工作,并且能够在需要变化的情况下修改值。他们是一家审计公司,由于公司错过审计日期等原因,经常需要修改数字。

那么我怎样才能创建一个触发器来:

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);

更新触发器根据您的要求实现逻辑

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 触发器 - 如何存储计算字段的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10151687/

相关文章:

mysql - Cisco CallManager AXL SQL 工具包 - 检索目录号码和用户 ID

php - 在指定时间后删除 Mysql 行

sql - 使用 perl 自动执行 sql 连接

c# - SQL 触发器试图插入空值,但我的 C# 代码传递的是 int 300?

mysql - 选择最新的行,忽略旧的重复项

mysql - 奇怪的 MySQL 行为。有些行在排序后出现但在执行后不出现

mysql - mysql中使用多个表的触发器

google-apps-script - 使自定义函数刷新

wpf - WPF显示/隐藏带有触发器的控件

database - 如何找出从哪里填充数据库表?