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

Откуда:
Сообщений: 265
Подскажите пожалуйста, у меня ключ E1.Sequence должен быть уникальным но он не автоинкремент и E1.Sequence + 1 уже пробовал не помогло :), подскажите как сделать так что бы у меня записи добавлялись к примеру:

1
2
3
4
5

Если я сделаю поле авто инкремент, это мне поможет? Но может есть другие варианты?


	
INSERT INTO ClaimSequenceHeads
SELECT DISTINCT E1.Sequence, 0, E1.WpID, NULL, 0, 1, GETDATE() 
FROM ClaimSequenceHeads E1	
WHERE E1.TypeID NOT in (SELECT E2.TypeID from ClaimSequenceHeads E2 WHERE E2.TypeID = 0 AND E2.WpID = E1.WpID)
17 авг 16, 11:51    [19551391]     Ответить | Цитировать Сообщить модератору
 Re: Violation of PRIMARY KEY constraint 'PkClaimSequenceHeads'. Cannot insert duplicate key in  [new]
msLex
Member

Откуда:
Сообщений: 9271
Pabl0
E1.Sequence должен быть уникальным

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




Pabl0
WHERE E1.TypeID NOT in (SELECT E2.TypeID from ClaimSequenceHeads E2 WHERE E2.TypeID = 0 AND E2.WpID = E1.WpID)

Выглядеть очень странно
17 авг 16, 12:01    [19551449]     Ответить | Цитировать Сообщить модератору
 Re: Violation of PRIMARY KEY constraint 'PkClaimSequenceHeads'. Cannot insert duplicate key in  [new]
msLex
Member

Откуда:
Сообщений: 9271
Выглядеть = Выглядит
17 авг 16, 12:01    [19551451]     Ответить | Цитировать Сообщить модератору
 Re: Violation of PRIMARY KEY constraint 'PkClaimSequenceHeads'. Cannot insert duplicate key in  [new]
Berd.
Member [заблокирован]

Откуда:
Сообщений: 389
AUTO_INCREMENT должен помочь.
Или попробуйте уникальный индекс
17 авг 16, 12:02    [19551459]     Ответить | Цитировать Сообщить модератору
 Re: Violation of PRIMARY KEY constraint 'PkClaimSequenceHeads'. Cannot insert duplicate key in  [new]
Pabl0
Member

Откуда:
Сообщений: 265
msLex, он уникальный
17 авг 16, 12:07    [19551484]     Ответить | Цитировать Сообщить модератору
 Re: Violation of PRIMARY KEY constraint 'PkClaimSequenceHeads'. Cannot insert duplicate key in  [new]
Pabl0
Member

Откуда:
Сообщений: 265
msLex, На счет условия проверки согласен есть косяки
17 авг 16, 12:15    [19551518]     Ответить | Цитировать Сообщить модератору
 Re: Violation of PRIMARY KEY constraint 'PkClaimSequenceHeads'. Cannot insert duplicate key in  [new]
Berd.
Member [заблокирован]

Откуда:
Сообщений: 389
Pabl0
INSERT INTO ClaimSequenceHeads
SELECT DISTINCT E1.Sequence, 0, E1.WpID, NULL, 0, 1, GETDATE() 
FROM ClaimSequenceHeads E1	
WHERE E1.TypeID NOT in (SELECT E2.TypeID from ClaimSequenceHeads E2 WHERE E2.TypeID = 0 AND E2.WpID = E1.WpID)

Так будет медленно работать.
Лучше так переписать:
SELECT E1.Sequence, 0, E1.WpID, NULL, 0, 1, GETDATE() 
FROM ClaimSequenceHeads E1	
LEFT JOIN ClaimSequenceHeads  E2 ON
E2.TypeID   = 0 
AND E2.WpID = E1.WpID
WHERE
E2.TypeID IS NULL   --т.к. NOT IN
GROUP BY E1.Sequence, E1.WpID

Вообще IN медленно работает - лучше нигде его не использовать
GETDATE() будет вычисляться при каждой вставке - более производительно будет использовать для него переменную, если код внутри триггера или процедуры.
DISTINCT тоже тормозит производительность - вместо него в данном случае лучше использовать GROUP BY

В добавок, INSERT блокирует таблицу. Надо стараться делать операции вставки максимально быстрыми.
На простом уровне - сначала выбирайте данные во временную таблицу, потом уже из неё вставляйте - так не будет блокироваться таблица на всё время SELECTa. Метод не лишён недостатков, т.к. за время действия запроса информация во временной таблице может устареть. Тут надо по ситуации смотреть.

Если ещё большие объёмы данных и ещё более критичное время вставки - в некоторых случаях можно обойти используя партиции.
Допустим, партиционирование подневное:
Выбираете в новую партицию все данные из старой за этот день.
Меняете данные какие надо.
Подменяете партиции.
17 авг 16, 12:16    [19551523]     Ответить | Цитировать Сообщить модератору
 Re: Violation of PRIMARY KEY constraint 'PkClaimSequenceHeads'. Cannot insert duplicate key in  [new]
Berd.
Member [заблокирован]

Откуда:
Сообщений: 389
А вообще, если в таблице 1 уникальный индекс - и это поле ID INT - то лучше использовать автоинкримент, и мозги не парить.
17 авг 16, 12:19    [19551541]     Ответить | Цитировать Сообщить модератору
 Re: Violation of PRIMARY KEY constraint 'PkClaimSequenceHeads'. Cannot insert duplicate key in  [new]
Berd.
Member [заблокирован]

Откуда:
Сообщений: 389
msLex
Pabl0
WHERE E1.TypeID NOT in (SELECT E2.TypeID from ClaimSequenceHeads E2 WHERE E2.TypeID = 0 AND E2.WpID = E1.WpID)

Выглядеть очень странно

+1
Посмотри дополнительно, может там можно вообще одной таблицей обойтись - просто сравнить Е1.TypeId с нулём.
17 авг 16, 12:21    [19551556]     Ответить | Цитировать Сообщить модератору
 Re: Violation of PRIMARY KEY constraint 'PkClaimSequenceHeads'. Cannot insert duplicate key in  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Berd.,

автор
Вообще IN медленно работает - лучше нигде его не использовать
GETDATE() будет вычисляться при каждой вставке - более производительно будет использовать для него переменную, если код внутри триггера или процедуры.
DISTINCT тоже тормозит производительность - вместо него в данном случае лучше использовать GROUP BY

как то даже слов нет...
IN работает медленнее чего???
GETDATE()при каждой вставке ой ли?
DISTINCT - GROUP BY одинаково
17 авг 16, 12:31    [19551617]     Ответить | Цитировать Сообщить модератору
 Re: Violation of PRIMARY KEY constraint 'PkClaimSequenceHeads'. Cannot insert duplicate key in  [new]
Pabl0
Member

Откуда:
Сообщений: 265
Berd., Спасибо большое, за такой развернутый ответ :)
17 авг 16, 13:00    [19551805]     Ответить | Цитировать Сообщить модератору
 Re: Violation of PRIMARY KEY constraint 'PkClaimSequenceHeads'. Cannot insert duplicate key in  [new]
o-o
Guest
TaPaK
Berd.,

автор
Вообще IN медленно работает - лучше нигде его не использовать
GETDATE() будет вычисляться при каждой вставке - более производительно будет использовать для него переменную, если код внутри триггера или процедуры.
DISTINCT тоже тормозит производительность - вместо него в данном случае лучше использовать GROUP BY

как то даже слов нет...
IN работает медленнее чего???
GETDATE()при каждой вставке ой ли?
DISTINCT - GROUP BY одинаково

помело с ПТ
Pabl0, вилку не подарить, чтоб лапшу снимать?
create table #t (surprise datetime);

insert into #t
select top 50000000 getdate()  
from sys.columns c1 cross join sys.columns c2 cross join sys.columns c3; -- 

select distinct surprise
from #t;

надеюсь, оно достаточно времени вставлялось, чтоб земетить,
дата в конце вставки отличается ли от даты начала
17 авг 16, 13:27    [19551995]     Ответить | Цитировать Сообщить модератору
 Re: Violation of PRIMARY KEY constraint 'PkClaimSequenceHeads'. Cannot insert duplicate key in  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
автор
Допустим, партиционирование подневное:
Выбираете в новую партицию все данные из старой за этот день.
Меняете данные какие надо.
Подменяете партиции.

подневное "партиционирование" конечно вызовет зависть всех архитекторов :)
17 авг 16, 13:30    [19552019]     Ответить | Цитировать Сообщить модератору
 Re: Violation of PRIMARY KEY constraint 'PkClaimSequenceHeads'. Cannot insert duplicate key in  [new]
iljy
Member

Откуда:
Сообщений: 8711
o-o
помело с ПТ
Pabl0, вилку не подарить, чтоб лапшу снимать?


Да там в ответе прекрасно все, включая рассуждения о

Berd.
В добавок, INSERT блокирует таблицу.
.....
Метод не лишён недостатков, т.к. за время действия запроса информация во временной таблице может устареть. Тут надо по ситуации смотреть.
17 авг 16, 20:09    [19554233]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить