【问题标题】:Updating a column when a new row is inserted in sql server在sql server中插入新行时更新列
【发布时间】:2013-12-23 21:08:31
【问题描述】:

这个触发器产生了问题,我找不到原因。

CREATE TRIGGER initialpay 
   ON  table1
   AFTER INSERT
AS 
BEGIN
SET NOCOUNT ON;
declare @value char
select @value = '1000000' from inserted

    update table1 
    set table1.column1 = @value

END

插入新行时,所有行的整列都会更新。我只想更新新插入的行。 谁能告诉我这是什么问题?

【问题讨论】:

  • 您在更新中没有where 子句
  • 插入的 id 列是什么?
  • 在我的表中是user_id。我应该添加where user_id = user_id吗?
  • 如果这对每个用户都是一样的,为什么不把它作为表中的默认值,而不是需要触发器呢?

标签: sql sql-server


【解决方案1】:

您假设只插入了一行。您需要使您的触发器集面向,否则您将错过多行插入。

CREATE TRIGGER initialpay 
   ON  table1
   AFTER INSERT
AS BEGIN
    IF @@ROWCOUNT = 0 RETURN
    SET NOCOUNT ON;

    update t1
    set column1 = i.col
    from table1 t1
    join inserted i on t1.id = i.id

END

【讨论】:

  • i.col 是从哪里来的?你不应该设置column1 = '1000000'吗?
  • 也许,但我认为这是一个例子。我不认为他真的想更新他的表中的文字值。我不认为他真的想更新 table1 中的所有行,没有 WHERE 子句。无论如何,关于真正需求的信息还不够。
  • 只是想我会问,因为问题中没有提到col。 OP问“插入新行时,所有行的整列都在更新。我只想更新新插入的行”,所以你的答案是正确的。加入inserted 表将更新新插入的行,并且是针对多个插入的基于集合的解决方案;不需要where 子句。
  • 你说得对,我没有仔细阅读。我只是很难理解在这个触发器中做了什么:)
【解决方案2】:

你必须使用如下语法:

 update table1 
 set table1.column1 = @value
 FROM inserted
 WHERE table1.id= inserted.id;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多