究竟是什么"(X行(s)受影响)"意思?

时间:2015-07-10 15:41:55

标签: sql sql-server-2012

我运行了一个简单的查询:

UPDATE table

SET user_id = '123456'

WHERE user_id = '234567'

然后我收到错误消息:

(2942 row(s) affected)
Msg 2627, Level 14, State 1, Line 3
Violation of PRIMARY KEY constraint 'PK__users__6B24EA82'. Cannot insert duplicate key in object 'dbo.users'. The duplicate key value is (123456).
The statement has been terminated.

这是否意味着我实际上已经对2942行进行了更改?它不会那样出现。我的搜索没有太多运气。任何帮助表示赞赏。

5 个答案:

答案 0 :(得分:5)

不,这意味着您将对2942行进行更改,除非其中一个或多个违反了PRIMARY KEY约束,因此它们被回滚。

答案 1 :(得分:5)

假设user_id是主键(错误消息根据错误消息中的值建议),则查询:

UPDATE table
    SET user_id = '123456'
    WHERE user_id = '234567';

永远不会影响table中的多行。 user_id是主键,因此它是唯一的。 where子句最多只能选择一行。

这表明桌面上有一个触发器。我认为2,942来自触发器而不是直接来自此声明。如果我不得不猜测,它是一个替代更新触发器,可能会影响另一个表。

该错误意味着您在表user_id = '123456'中已经有一行,因此不应对该表进行更新。

(注意:这个想法的变化是可能的。触发器可能正在更新另一个表,主键违规可能就在那里。上面的场景似乎更有可能出现。)

答案 2 :(得分:2)

当使用user_id ='234567'更新表中的行时,在更新可能2943行期间发生了一些PK违规,并且所有先前的更新都被回滚。所以你的搜索失败了

如果您认为表中没有重复项

请参阅No duplicates exist but get Msg 2627

答案 3 :(得分:2)

由于pk违规而发生回滚,并且您没有看到先前行的更新

答案 4 :(得分:1)

您的桌面上有trigger,它会执行某些操作,而trigger会生成该行计数消息。我可以使用instead of update trigger

重现此行为
CREATE TABLE [dbo].[Table_1](
    [ID] [int] NOT NULL,
 CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
))
go

CREATE TABLE [dbo].[Table_2](
    [ID] [int] NOT NULL)
go

insert into Table_1 values(1),(2),(3),(4)
update Table_1 set ID = 2 where ID = 1
  

Msg 2627,Level 14,State 1,Line 1
违反PRIMARY KEY   约束'PK_Table_1'。无法在对象中插入重复键   'dbo.Table_1'。该声明已经终止。

create trigger [tr_Table_1] on [Table_1]
instead of update 
as 
begin
    insert into [dbo].[Table_2]
    select * from [dbo].[Table_1]
    update Table_1 set ID = 2 where ID = 1
end
go

update Table_1 set ID = 2 where ID = 1
  

(受影响的4行)
消息2627,级别14,状态1,程序   tr_Table_1,第8行
  违反PRIMARY KEY约束'PK_Table_1'。   无法在对象'dbo.Table_1'中插入重复键。该声明有   已被终止。