我运行了一个简单的查询:
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行进行了更改?它不会那样出现。我的搜索没有太多运气。任何帮助表示赞赏。
答案 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违规,并且所有先前的更新都被回滚。所以你的搜索失败了
如果您认为表中没有重复项
答案 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'中插入重复键。该声明有 已被终止。