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

Откуда:
Сообщений: 334
есть главная таблица
create table [Values]
(
[Parameter1] varchar(32) not null,
[Parameter2] varchar(32) not null,
[Parameter3] varchar(32) not null,
[Parameter4] varchar(32) not null,
[BegDate] datetime not null,
[EndDate] datetime not null,
constraint [PK_Values] primary key clustered ([Parameter1],[Parameter2],[Parameter3],[Parameter4])
)

есть маленькая таблица:
create table [Values_]
(
[Parameter1] varchar(32) not null,
[Parameter2] varchar(32),
[Parameter3] varchar(32) not null,
[Parameter4] varchar(32) not null,
[BegDate] datetime not null,
[EndDate] datetime not null
)

вставка в главную таблицу осуществляется так:
insert into [Values] ([Parameter1],[Parameter2],[Parameter3],[Parameter4],[BegDate],[EndDate])
select
[Parameter1],
coalesce([Parameter2],'unknown')
[Parameter3],
[Parameter4],
[BegDate],
[EndDate]
from [Values_] a
where not exists (select * from [Values] b where a.[Parameter1]=b.[Parameter1]  and a.[Parameter2]=coalesce([Parameter2],'unknown')
and a.[Parameter3]=b.[Parameter3] and a.[Parameter4]=b.[Parameter4] )

Появилась ошибка о невозможности встваки в главную таблицу из-за нарушения PK.
Ума не приложу, из-за чего. Помогите плиз.
21 янв 15, 16:50    [17149987]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с PK  [new]
DKasimov
Member

Откуда: Москва
Сообщений: 63
=Сергей=,
Ну для начала вы пропустили запятую
coalesce([Parameter2],'unknown'),


А дальше, нужно смотреть.
Какую именно ошибку выкидывает?
21 янв 15, 16:55    [17150022]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с PK  [new]
Konst_One
Member

Откуда:
Сообщений: 11600
[Parameter2] varchar(32),


и что тут будет?
null = coalesce([Parameter2],'unknown')
21 янв 15, 16:57    [17150034]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с PK  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
select
[Parameter1],
coalesce([Parameter2],'unknown')
[Parameter3],
[Parameter4],
[BegDate],
[EndDate]
from [Values_] a
where not exists (select * from [Values] b where a.[Parameter1]=b.[Parameter1]  and a.[Parameter2]=coalesce([Parameter2],'unknown')
and a.[Parameter3]=b.[Parameter3] and a.[Parameter4]=b.[Parameter4] )
and a.[Parameter2] IS NULL


смотрите результат етого запроса
21 янв 15, 16:58    [17150046]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с PK  [new]
DKasimov
Member

Откуда: Москва
Сообщений: 63
=Сергей=,

+ Мне очень не сипатизирует тот момент, что один из атрибутов который является в другой таблице частью составного ключа может быть NULL.
Если у вас все остальные его части будут разные у всех записей, то два NULL-а, вам сломают всю Вашу вставку
21 янв 15, 17:01    [17150074]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с PK  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Konst_One
и что тут будет?
UNKNOWN, вестимо
21 янв 15, 17:02    [17150091]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с PK  [new]
Konst_One
Member

Откуда:
Сообщений: 11600
iap
Konst_One
и что тут будет?
UNKNOWN, вестимо


воот, а ТС негодует
ПК у него не даёт вставлять
21 янв 15, 17:03    [17150108]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с PK  [new]
Эмоции
Guest
=Сергей=
есть главная таблица

insert into [Values] ([Parameter1],[Parameter2],[Parameter3],[Parameter4],[BegDate],[EndDate])
select
[Parameter1],
coalesce([Parameter2],'unknown')
[Parameter3],
[Parameter4],
[BegDate],
[EndDate]
from [Values_] a
where not exists (select * from [Values] b where a.[Parameter1]=b.[Parameter1]  and coalesce(a.[Parameter2],'unknown') = b.[Parameter2]
and a.[Parameter3]=b.[Parameter3] and a.[Parameter4]=b.[Parameter4] )
21 янв 15, 17:05    [17150130]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с PK  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
проапдейтил в маленькой таблице все null-значения на 'unknown'
так тоже не работает:
insert into [Values] ([Parameter1],[Parameter2],[Parameter3],[Parameter4],[BegDate],[EndDate])
select
[Parameter1],
[Parameter2],
[Parameter3],
[Parameter4],
[BegDate],
[EndDate]
from [Values_] a
where not exists (select * from [Values] b where a.[Parameter1]=b.[Parameter1]  and a.[Parameter2]=b.[Parameter2] and a.[Parameter3]=b.[Parameter3] and a.[Parameter4]=b.[Parameter4] )


Violation of PRIMARY KEY constraint 'PK_Values' Cannot insert duplicate key in object 'dbo.Values'.
21 янв 15, 17:14    [17150204]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с PK  [new]
Эмоции
Guest
=Сергей=,

Значит в селекте (оставшемся) задвоения

Типа
[Parameter1], [Parameter2] = NULL, [Parameter3], [Parameter4]
[Parameter1], [Parameter2]= 'unknown', [Parameter3], [Parameter4]
21 янв 15, 17:19    [17150248]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с PK  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
Эмоции,
В таблице Values_ были дубли
21 янв 15, 17:25    [17150300]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с PK  [new]
DKasimov
Member

Откуда: Москва
Сообщений: 63
=Сергей=,

Круто)) Обычно это проверяют с самого начала
21 янв 15, 17:26    [17150311]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с PK  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
DKasimov
=Сергей=,

Круто)) Обычно это проверяют с самого начала

А у меня и есть самое начало :)
21 янв 15, 17:31    [17150352]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с PK  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
insert into [Values] ([Parameter1],[Parameter2],[Parameter3],[Parameter4],[BegDate],[EndDate])
select top 1 with ties
[Parameter1],
coalesce([Parameter2],'unknown'),
[Parameter3],
[Parameter4],
[BegDate],
[EndDate]
from [Values_] a
where not exists (select * from [Values] b where a.[Parameter1]=b.[Parameter1]  and coalesce(a.[Parameter2],'unknown') = b.[Parameter2]
and a.[Parameter3]=b.[Parameter3] and a.[Parameter4]=b.[Parameter4] )
order by ROW_NUMBER()OVER(partition by a.[Parameter1],coalesce(a.[Parameter2],'unknown'),a.[Parameter3],a.[Parameter4] order by a.[BegDate])
22 янв 15, 07:26    [17151964]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить