2015-07-10 2 views
4

Я побежал простой запрос:Что именно означает «(затронуты строки X)?

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 строк? Это не так. Мне не очень повезло в моих поисках. Любая помощь приветствуется.

+1

Эта ошибка не имеет смысла. Если на 'user_id' есть ограничение первичного ключа, на него будет влиять только одна строка' where user_id = '234567''. –

+0

Нет, это означает, что 2942 строки соответствуют условию. –

+0

@DavideR. , , , Согласно ошибке, столбец с первичным ключом * является * 'user_id' - тот же столбец используется как для назначения, так и для' where'. Возвращаемые строки не имеют смысла. Сравнение равенства по первичному ключу никогда не должно возвращать более одной строки. Если это был составной ключ, тогда сообщение об ошибке должно содержать все столбцы. –

ответ

5

Нет, это означает, что вы внесли бы изменения в 2942 строки, за исключением того, что один или несколько из них нарушают ограничение PRIMARY KEY, поэтому они были отброшены назад.

+0

Отлично! Спасибо, Холмс! – Sung

+0

@Sung. , , Странно, что вы приняли этот ответ, потому что это не представляется возможным на основе информации в вопросе. Ограничение первичного ключа, по-видимому, находится на 'user_id' (хотя есть небольшая возможность в каком-то другом столбце), поэтому' update' может влиять не более одной строки. –

+0

@ Хольмс Я не понимаю, что именно «не представляется возможным». Я принял ваш ответ, потому что ваше объяснение, казалось, отвечало на мой вопрос. Я хотел знать, означает ли «x rows affected» означает, что x строк изменены. И из вашего ответа это звучало как «нет». Разве это не так? – Sung

2

при обновлении строк в таблице с помощью user_id = '234567' произошло некоторое нарушение PK во время обновления, вероятно, строки 2943, и все предыдущие обновления откатятся. так что ваш поиск не удается

, если вы думаете, что нет дубликатов в таблице

пожалуйста, обратитесь No duplicates exist but get Msg 2627

5

Предполагая, что user_id является первичным ключом (который появляется сообщение об ошибке предлагает на основе значения в сообщение об ошибке), то запрос:

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

никогда не может повлиять на более чем одну строку в table. user_id - первичный ключ, поэтому он уникален. Предложение where выберет не более одной строки.

Это означает, что на столе есть триггер. Я думаю, что 2,942 исходит от триггера не из этого утверждения напрямую. Если бы я должен был догадаться, это вместо триггера обновления, вероятно, затрагивает другую таблицу.

Ошибка подразумевает, что у вас уже есть строка в таблице, где user_id = '123456', поэтому в эту таблицу не нужно добавлять обновления.

(Примечание:... Вариация этой идеи возможна Триггер может быть обновление другой таблицы и первичным ключом нарушения может быть там выше сценарий кажется более вероятным сценарий)

+0

Это облегчение. Я просто хотел быть уверенным. Спасибо за ваш вклад, Гордон. – Sung

2

Откат происходит потому, что нарушения pk и u не видят обновлений предыдущих строк.

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'.
Заявление содержит .

+0

Большое спасибо за ваш вклад, Георгий. – Sung

Смежные вопросы