【问题标题】:MariaDB trigger loopMariaDB 触发循环
【发布时间】:2017-02-01 15:15:25
【问题描述】:

我正在为学校创建一个数据库。这就是问题: 我有一张带有属性 A、B 和 C 的表(其中 C=(A/(A+B))*100)。在更新属性 A 或 B 时,我需要更新 C。 我尝试了不同的方法,但触发器不断进入循环,因为当我更新 A 或 B 时,触发器会更新 C,所以它会继续运行。 此代码不起作用(sintax 错误):

Create trigger nametrigger
after update of (A or B) on tablename

但我需要以某种方式指定触发器必须在更新 A 或 B 而不是 C 时激活。

【问题讨论】:

  • 将代码保留在客户端中的另一个原因。

标签: sql triggers mariadb


【解决方案1】:

根据您的描述,您不需要触发器,您需要 C 成为 computed column(又名虚拟列)。

MariaDB [test]> CREATE TABLE t (
  a INT, 
  b INT, 
  c INT AS ((a/(a+b))*100) PERSISTENT
);

MariaDB [test]> insert into t (a,b) values (1,1);
MariaDB [test]> insert into t (a,b) values (2,2);

MariaDB [test]> select * from t;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    1 |    1 |   50 |
|    2 |    2 |   50 |
+------+------+------+
2 rows in set (0.01 sec)

MariaDB [test]> update t set b = b*2;

MariaDB [test]> select * from t;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    1 |    2 |   33 |
|    2 |    4 |   33 |
+------+------+------+
2 rows in set (0.00 sec)

这只是一个例子,不是解决方案。您需要阅读有关计算列的信息,以确定需要如何配置它。

【讨论】:

  • 感谢您的回答。即使 A 和 B 是另一个表中的属性,我也可以这样做?
  • 不,您不能,因为您可以通过问题中提供的链接从“虚拟(计算)列”页面的第一段中找到。但正如答案特别指出的那样,它解决了您所描述的情况,并且您明确地说所有列都属于同一个表:“我有一个具有属性 A、B 和 C 的表...”
猜你喜欢
  • 2011-05-13
  • 2011-02-16
  • 2017-09-03
  • 2015-09-19
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多