Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 первичный ключ  [new]
Tdmitry
Member

Откуда: Москва
Сообщений: 78
Доброго всем дня!
Подскажите, что делать?
вставили строки в таблицу insert'ом. первичный ключ при этом автоматом не проставлялся. вставили вручную. Теперь же при работе в сторонней программе, которая обращается к базе, при попытке внести новые записи в вышеуказанную таблицу ругается на дублирование первичного ключа
19 авг 13, 09:14    [14723922]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
aleks2
Guest
Tdmitry
вставили строки в таблицу insert'ом. первичный ключ при этом автоматом не проставлялся. вставили вручную. Теперь же при работе в сторонней программе, которая обращается к базе, при попытке внести новые записи в вышеуказанную таблицу ругается на дублирование первичного ключа


Опять кастинг на битву экстрасексов?

Скрипт создания таблицы покажи, Гульчатай.
19 авг 13, 09:21    [14723941]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2395
Tdmitry,

так вы можете проверить, сейчас в таблице "первичный" ключ дублируется?

программа точно писалась с учетом того что это полем будет первичным ключом? или вы его сами решили изменить?
19 авг 13, 09:23    [14723951]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
Tdmitry
Member

Откуда: Москва
Сообщений: 78
declare @ID as int
set @ID=15566
INSERT INTO MED_PLPARAM (MED_PLPARAM_ID ,PL_PARAM_ID, MEDECINS_ID)
SELECT @ID+ (SELECT SUM(1) FROM PL_SUBJ_PARAM psp JOIN PL_SUBJ ps ON PS.PL_SUBJ_ID = PSP.PL_SUBJ_ID
JOIN MEDECINS m ON M.MEDECINS_ID=PS.MEDECINS_ID
where psp.PL_PARAM_ID=79 AND m.MEDECINS_ID<=MEDECINS.MEDECINS_ID)
, 79 ,MEDECINS.MEDECINS_ID from PL_SUBJ_PARAM JOIN PL_SUBJ ON PL_SUBJ.PL_SUBJ_ID = PL_SUBJ_PARAM.PL_SUBJ_ID
JOIN MEDECINS ON MEDECINS.MEDECINS_ID=PL_SUBJ.MEDECINS_ID
where PL_PARAM_ID=79

MED_PLPARAM_ID тот самый ключ

Есть ли возможность поменять текущее значение первичного ключа?
при создании новой строки сервер пытается ID задать 15566 опять
19 авг 13, 09:25    [14723959]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
saycale
Member

Откуда: Москва->Сидней
Сообщений: 32
нужен полный скрипт создания таблицы (с информациях о ключах, индексах и триггерах) и сообщение об ошибке, иначе будем заниматься гаданием.
19 авг 13, 09:26    [14723963]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
Tdmitry
Member

Откуда: Москва
Сообщений: 78
где его искать? скрипт создания?
19 авг 13, 09:27    [14723970]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
Tdmitry
Member

Откуда: Москва
Сообщений: 78
Violation of PRIMARY KEY constraint 'PK_MED_PLPARAM'. Cannot insert duplicate key in object 'dbo.MED_PLPARAM'.
The statement has been terminated

вот ошибка
19 авг 13, 09:31    [14723981]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
aleks2
Guest
Tdmitry
Violation of PRIMARY KEY constraint 'PK_MED_PLPARAM'. Cannot insert duplicate key in object 'dbo.MED_PLPARAM'.
The statement has been terminated

вот ошибка

Ну ладно, тредстартер "из больницы" - там фсе больные.
Посмотреть то на результат
SELECT @ID+ (SELECT SUM(1) FROM PL_SUBJ_PARAM psp JOIN PL_SUBJ ps ON PS.PL_SUBJ_ID = PSP.PL_SUBJ_ID
JOIN MEDECINS m ON M.MEDECINS_ID=PS.MEDECINS_ID
where psp.PL_PARAM_ID=79 AND m.MEDECINS_ID<=MEDECINS.MEDECINS_ID)

не судьба?
19 авг 13, 09:33    [14723995]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2395
Tdmitry
где его искать? скрипт создания?


правой клавишей мыши на таблицу, "создать сценарий - используя create...."
19 авг 13, 10:01    [14724105]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
Tdmitry
Member

Откуда: Москва
Сообщений: 78
SET ANSI_NULLS OFF
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[MED_PLPARAM](
	[MED_PLPARAM_ID] [int] NOT NULL,
	[PL_PARAM_ID] [int] NOT NULL,
	[MEDECINS_ID] [int] NULL,
	[KRN_CREATE_DATE] [datetime] NULL,
	[KRN_CREATE_USER_ID] [int] NULL,
	[KRN_MODIFY_DATE] [datetime] NULL,
	[KRN_MODIFY_USER_ID] [int] NULL,
	[KRN_CREATE_DATABASE_ID] [int] NULL,
	[KRN_MODIFY_DATABASE_ID] [int] NULL,
	[KRN_GUID] [varchar](36) NULL,
 CONSTRAINT [PK_MED_PLPARAM] PRIMARY KEY CLUSTERED 
(
	[MED_PLPARAM_ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO
19 авг 13, 10:05    [14724123]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
сургей
Member

Откуда:
Сообщений: 5
Кури DBCC CHECKIDENT
19 авг 13, 10:06    [14724126]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
сургей
Кури DBCC CHECKIDENT
А где у него IDENTITY?
19 авг 13, 10:10    [14724137]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
Tdmitry,

как "сторонняя программа" расчитывает PK?
Какой вообще запрос на добавление записи она посылает серверу (см. SQL Server Profiler)?
19 авг 13, 10:12    [14724141]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
Tdmitry
Member

Откуда: Москва
Сообщений: 78
select MED_PLPARAM_ID from MED_PLPARAM 
where  MEDECINS_ID = 1737 
and  PL_PARAM_ID = 7 

declare @P1 int
exec up_get_id  @KeyName = 'MED_PLPARAM', @Shift = 1, @ID = @P1 output
select @P1 Result

insert into MED_PLPARAM
(MED_PLPARAM_ID,PL_PARAM_ID,MEDECINS_ID, KRN_CREATE_DATE, KRN_CREATE_USER_ID, KRN_MODIFY_DATE, KRN_MODIFY_USER_ID)
values(4359,7,1737, convert(varchar(30),GetDate(),20), 1, convert(varchar(30),GetDate(),20), 1)
19 авг 13, 10:23    [14724188]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
Tdmitry,

то есть, в ответ Вы показываете снаружи чёрный ящик (up_get_id)
и уверены, что все сразу разберутся во всём что ли?

Откуда взялась константа 4359?
19 авг 13, 10:50    [14724306]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Смею побыть капитаном: в up_get_id используется некая таблица, где и лежит число 4359. И оно никак не связано/не соответствует нужному для инсерта...
19 авг 13, 10:55    [14724333]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ambarka_max,

все может быть...
19 авг 13, 11:02    [14724366]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
Tdmitry
Member

Откуда: Москва
Сообщений: 78
все что было в профайлере.
откуда берутся эти цифры, сам не знаю
19 авг 13, 11:12    [14724408]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Tdmitry, нужен текст процедуры up_get_id
19 авг 13, 11:14    [14724418]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
Glory
Member

Откуда:
Сообщений: 104751
Tdmitry
все что было в профайлере.

Это все, что вы указали трассировать
Tdmitry
откуда берутся эти цифры, сам не знаю

Из процедуры up_get_id
19 авг 13, 11:17    [14724437]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
Tdmitry
Member

Откуда: Москва
Сообщений: 78
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER procedure [dbo].[up_get_id](@KeyName varchar(30),@Shift integer,@ID integer output)
as
begin
  declare
    @rc int,
    @err int 
  begin tran
  
  update V set LAST_VALUE = COALESCE(LAST_VALUE,0) + @Shift 
    from ID_VALUES V with (UPDLOCK, ROWLOCK)  
    where Key_NAME = @KeyName
  select @rc = @@RowCount,
         @err = @@Error    
  if @err <> 0 goto L_ERROR
  if @rc = 0       
  begin
    insert into ID_VALUES values(@KeyName, @Shift)
    if @@ERROR<>0 goto L_ERROR
  end  
  select @ID = LAST_VALUE - @Shift + 1 
    from ID_VALUES 
    where KEY_NAME=@KeyName

  commit tran
  
  return 0
  L_ERROR: if @@TRANCOUNT<>0 rollback tran
  raiserror 50001 'E001-Error in sp_get_id.'
end
19 авг 13, 11:20    [14724458]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
Glory
Member

Откуда:
Сообщений: 104751
В таблице ID_VALUES хранятся значения, которые ваше приложение использует для генерации ключей
Найдите там запись для таблицы MED_PLPARAM и исправьте значение на нужное.
19 авг 13, 11:33    [14724529]     Ответить | Цитировать Сообщить модератору
 Re: первичный ключ  [new]
Tdmitry
Member

Откуда: Москва
Сообщений: 78
ок! всем большое спасибо!
19 авг 13, 11:52    [14724656]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить