Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 UPDATE + Violation of PRIMARY KEY constraint  [new]
VulpesIncanus
Member

Откуда:
Сообщений: 7
Добрый день.
У меня возникла следующая проблема.
При обновлении записи возникает следующая ошибка:

Violation of PRIMARY KEY constraint 'PK_T1'. Cannot insert duplicate key in object 'dbo.T1'.

Скрипт обновления:

update T1 set [Date] = '2011-10-27 15:45:00' where [ID] = 432403

Структура таблицы:

USE [Pricing]
GO
/****** Object:  Table [dbo].[T1]    Script Date: 10/28/2011 15:39:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[T1](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[TeamHome] [int] NOT NULL,
	[TeamAway] [int] NOT NULL,
	[Date] [datetime] NOT NULL,
	[lTour] [int] NOT NULL,
	[OwnerID] [int] NOT NULL,
	[oMatchID] [int] NULL,
	[Deleted] [int] NOT NULL CONSTRAINT [DF_T1_Deleted]  DEFAULT ((0)),
	[Updated] [datetime] NOT NULL CONSTRAINT [DF_T1_Updated]  DEFAULT (getdate()),
	[ExternalID] [int] NULL,
	[TeamOrder] [int] NOT NULL CONSTRAINT [DF_T1_TeamOrder]  DEFAULT ((0)),
 CONSTRAINT [PK_T1] PRIMARY KEY CLUSTERED 
(
	[TeamHome] ASC,
	[TeamAway] ASC,
	[Date] ASC,
	[lTour] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
/****** Object:  Statistic [_dta_stat_757577737_2_3_5]    Script Date: 10/28/2011 15:39:03 ******/
CREATE STATISTICS [_dta_stat_757577737_2_3_5] ON [dbo].[T1]([TeamHome], [TeamAway], [lTour])
GO
/****** Object:  Statistic [_dta_stat_757577737_4_2_3_5_6]    Script Date: 10/28/2011 15:39:03 ******/
CREATE STATISTICS [_dta_stat_757577737_4_2_3_5_6] ON [dbo].[T1]([Date], [TeamHome], [TeamAway], [lTour], [OwnerID])
GO
/****** Object:  Statistic [_dta_stat_757577737_5_4_2]    Script Date: 10/28/2011 15:39:03 ******/
CREATE STATISTICS [_dta_stat_757577737_5_4_2] ON [dbo].[T1]([lTour], [Date], [TeamHome])
GO
/****** Object:  Statistic [_dta_stat_757577737_6_5_4_2]    Script Date: 10/28/2011 15:39:03 ******/
CREATE STATISTICS [_dta_stat_757577737_6_5_4_2] ON [dbo].[T1]([OwnerID], [lTour], [Date], [TeamHome])

Обновляемое поле [date] часть первичного ключа, перед обновлением проверяется возможное существование записи конфликтующей с новыми значениям.
В общем, поможите люди добрыя ))
28 окт 11, 13:46    [11515650]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
Glory
Member

Откуда:
Сообщений: 104751
VulpesIncanus
В общем, поможите люди добрыя ))

Не делайте обновлений, которые нарушают PRIMARY KEY
28 окт 11, 13:50    [11515682]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
VulpesIncanus
Violation of PRIMARY KEY constraint 'PK_T1'. Cannot insert duplicate key in object 'dbo.T1'.

Обновляемое поле [date] часть первичного ключа, перед обновлением проверяется возможное существование записи конфликтующей с новыми значениям.

плохо проверяется
28 окт 11, 13:53    [11515718]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
VulpesIncanus
Member

Откуда:
Сообщений: 7
2 Glory : Я в курсе что обновлять первичный ключ не комильфо.
Но удалить запись и создать новую по ряду причин проблематично.

2 Shakill: Проверяется хорошо.

select * from T1
where [TeamHome]=1 and [TeamAway]=2 and [Date]='2011-10-27 15:45:00' and [lTour]=3

База данных в однопользовательском режиме, скрипты выполняются в QA.
28 окт 11, 14:07    [11515858]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
VulpesIncanus
2 Shakill: Проверяется хорошо.
Так может, вы обновляете другую запись, Или допускаете обновление этой записи в других коннектах?

Вы весь код покажите.

Нужно обеспечить, что бы конкретно эта запись с [ID] = 432403 при обновлении ПК не нарушала констрейна, а не просто селект сделать.
28 окт 11, 14:17    [11515971]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
VulpesIncanus, покажите запись, которую вы обновляете
и вообще весь код проверки и обновления
28 окт 11, 14:18    [11515987]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
VulpesIncanus
Member

Откуда:
Сообщений: 7
Дополнение: Проблема не в первичном ключе.

Я пересоздал первичный ключ на поле [ID],
а из полей [TeamHome],[TeamAway],[Date],[lTour] собрал уникальный индекс.

Текст ошибки поменялся на:

Cannot insert duplicate key row in object 'dbo.lMatches' with unique index 'IX_lMatches_1'.
28 окт 11, 14:20    [11516001]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
alexeyvg
VulpesIncanus
2 Shakill: Проверяется хорошо.
Так может, вы обновляете другую запись
+1
И уникальность [ID] у вас, вообще-то, не гарантирована...
28 окт 11, 14:22    [11516015]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
VulpesIncanus, вы создали другой индекс, который требует уникальности того же сочетания полей. теперь он не является первичным ключом, но суть осталась
28 окт 11, 14:23    [11516028]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
VulpesIncanus
Проблема не в первичном ключе.
Ясен перец! Проблема в нарушении уникальности.
VulpesIncanus
Я пересоздал первичный ключ на поле [ID]
Предположение о неуникальности [ID] снимается
28 окт 11, 14:27    [11516066]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
VulpesIncanus
2 Glory : Я в курсе что обновлять первичный ключ не комильфо.
Но удалить запись и создать новую по ряду причин проблематично.

2 Shakill: Проверяется хорошо.

select * from T1
where [TeamHome]=1 and [TeamAway]=2 and [Date]='2011-10-27 15:45:00' and [lTour]=3

База данных в однопользовательском режиме, скрипты выполняются в QA.

И как это коррелирует с
update T1 set [Date] = '2011-10-27 15:45:00' where [ID] = 432403
Проверять нужно примерно так:
select
 t.* 
from
 T1 t
where
 exists(
  select * from T1 where [ID] = 432403 and [TeamHome] = t.[TeamHome] and [TeamAway] = t.[TeamAway] and [Date] = '20111027 15:45:00' and [lTour] = t.[lTour]
 )
28 окт 11, 14:35    [11516151]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
То есть, обновляете T1, а в тексте ошибки - lMatches?
У T1 триггер на UPDATE есть что ли?
28 окт 11, 14:37    [11516176]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
VulpesIncanus
Member

Откуда:
Сообщений: 7
Прошу прощения, господа.
Ошибка после пересоздания первичного ключа произошла из-за моей невнимательности.

С первичным ключом по [ID] и уникальным индексом по [TeamHome],[TeamAway],[Date],[lTour]
всё работает штатно.

2 Shakill:

В качестве гимнастики для ума ))
БД в синглюзере, все команды выполняются из QA.

Работаем вот с этой записью:
ID          TeamHome    TeamAway    Date                    lTour       OwnerID     oMatchID    Deleted     Updated                 ExternalID  TeamOrder
----------- ----------- ----------- ----------------------- ----------- ----------- ----------- ----------- ----------------------- ----------- -----------
432403      11775       58704       2011-10-27 15:45:01.000 1016        2           NULL        0           2011-10-28 14:59:12.310 1996251     0

Проверка на существование возможного дубликата

select * from lMatches
where [TeamHome]=11775 and [TeamAway]=58704 and [Date]='2011-10-27 15:45:00' and [lTour]=1016

(0 row(s) affected)

Пытаемся обновиться:
update lMatches set [Date] = '2011-10-27 15:45:00' where [ID] = 432403

имеем
Cannot insert duplicate key row in object 'dbo.lMatches' with unique index 'IX_lMatches_1'.


2 baracs Помимо всего прочего, поле [ID] - IDENTITY ))


2 All: Собственно, я отправил рекомендации по изменению структуры куда следует, но остался чисто академический интерес.
28 окт 11, 14:50    [11516312]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
Glory
Member

Откуда:
Сообщений: 104751
VulpesIncanus
Проверка на существование возможного дубликата

select * from lMatches
where [TeamHome]=11775 and [TeamAway]=58704 and [Date]='2011-10-27 15:45:00' and [lTour]=1016
(0 row(s) affected)
Пытаемся обновиться:
update lMatches set [Date] = '2011-10-27 15:45:00' where [ID] = 432403

А как
where [TeamHome]=11775 and [TeamAway]=58704 and [Date]='2011-10-27 15:45:00' and [lTour]=1016
соотносится с
where [ID] = 432403
?

select * from lMatches where [ID] = 432403 что выдает ?
28 окт 11, 14:52    [11516326]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
VulpesIncanus
2 baracs Помимо всего прочего, поле [ID] - IDENTITY ))
А какая связь IDENTITY с уникальностью?
28 окт 11, 14:54    [11516339]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
VulpesIncanus
Member

Откуда:
Сообщений: 7
2 [iap]: Прошу прощения, делал копию таблици для опытов и запутался в названиях.

2 [invm]: Я проверяю существование записи по полям входящим в первичный ключ, ваш способ ничем не лучше, а писать его дольше.
28 окт 11, 14:58    [11516382]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
Glory
Member

Откуда:
Сообщений: 104751
VulpesIncanus
Я проверяю существование записи по полям входящим в первичный ключ,

А откуда вы знаете, какие записи будет менять ваш update ?
28 окт 11, 14:59    [11516393]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
VulpesIncanus, был вопрос про триггеры, есть они на этой таблице?
28 окт 11, 15:03    [11516438]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
VulpesIncanus
Member

Откуда:
Сообщений: 7
2 Glory: Я не совсем пойму, что вы хотите сказать.
У меня есть identity поле [ID] с уникальным индексом, поэтому я точно знаю какую запись будет менять мой update.

Запись с ID = 432403 я приводил выше.
28 окт 11, 15:09    [11516494]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
VulpesIncanus
Member

Откуда:
Сообщений: 7
2 Shakill: Нет, тригеров нет.
28 окт 11, 15:10    [11516510]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE + Violation of PRIMARY KEY constraint  [new]
Glory
Member

Откуда:
Сообщений: 104751
VulpesIncanus
У меня есть identity поле [ID] с уникальным индексом,

Да что вы говорите ?
И где же этот уникальный индекс по полю [ID] в вашем скрипте ?
28 окт 11, 15:11    [11516520]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить