0

我对此有点陌生,但想写一些第一个简单的触发器。如果我有字段 A、B、C 的 mytable。当用户插入或更新 A 和 B 时,我想通过触发器更新 C=A+B 会容易吗?谢谢

4

1 回答 1

2

这是一个可以按照您的要求执行的触发器。由于 mytable 中缺少 ID 列,因此无法为已更新的行仅指定 update c(即,c每次插入/更新时,将为每一行重新计算 的值)。

CREATE TRIGGER mytrigger
ON mytable
FOR INSERT, UPDATE
AS
    UPDATE mytable
    SET    c = COALESCE(a, 0) + COALESCE(b, 0)

这将是计算列的合适候选者:

CREATE TABLE mytable
  (
     a INT,
     b INT,
     c AS COALESCE(a, 0) + COALESCE(b, 0)
  )

编辑:带有 ID 列的示例仅更新c更新/插入的行:

CREATE TRIGGER mytrigger
ON mytable
FOR INSERT, UPDATE
AS
    UPDATE mytable
    SET    c = COALESCE(a, 0) + COALESCE(b, 0)
    WHERE  ID IN (SELECT ID
                  FROM   inserted)

我创建了一个SQL Fiddle,您可以在其中实时查看。

让您了解 SQL Fiddle 示例:

  1. 创建模式,添加一些示例数据,然后添加触发器定义(c此时未填充)。
  2. 从表中选择,以便您查看示例值。
  3. 更新一行,然后再次从表中选择(可以看到c 现在已经被填充了)。
  4. 插入一个新行,然后再次从表中选择所有内容(c 已为此新行填充)。

为了进一步解释这是如何工作的 - 在触发器执行期间,SQL 服务器(我现在假设这是您正在使用的)创建两个临时表inserteddeleted包含受影响行的副本 - 我们可以加入或选择如果我们需要从这些表中获取数据;在这种情况下,只需获取受更新/插入操作影响的 id 列表,然后仅更新c这些行。有关这方面的更多详细信息,请参阅此 MSDN 文章

于 2012-06-13T15:07:34.940 回答