我对此有点陌生,但想写一些第一个简单的触发器。如果我有字段 A、B、C 的 mytable。当用户插入或更新 A 和 B 时,我想通过触发器更新 C=A+B 会容易吗?谢谢
问问题
3290 次
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 示例:
- 创建模式,添加一些示例数据,然后添加触发器定义(
c
此时未填充)。 - 从表中选择,以便您查看示例值。
- 更新一行,然后再次从表中选择(可以看到
c
现在已经被填充了)。 - 插入一个新行,然后再次从表中选择所有内容(
c
已为此新行填充)。
为了进一步解释这是如何工作的 - 在触发器执行期间,SQL 服务器(我现在假设这是您正在使用的)创建两个临时表inserted
并deleted
包含受影响行的副本 - 我们可以加入或选择如果我们需要从这些表中获取数据;在这种情况下,只需获取受更新/插入操作影响的 id 列表,然后仅更新c
这些行。有关这方面的更多详细信息,请参阅此 MSDN 文章。
于 2012-06-13T15:07:34.940 回答