powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
23 сообщений из 23, страница 1 из 1
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733536
Фотография leonix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переношу данные из одной таблицы в другую. Вылетает ошибка о том что пытаюсь вставить не уникальное значение в уникальный индекс. Как это можно обойти. Т.е. добавлять такую строку в этом случае.
Ниже запрос.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
insert into [dbo].[_InfoRg222] (
[_Fld223],--объект 
[_Fld224], --номер версии
[_Fld251], --дата версии
[_Fld225], --версия объекта
[_Fld226], --автор версии
[_Fld232], -- контрольная сумма
[_SimpleKey]
) 
SELECT         
[_Fld276],--объект 
[_Fld256]+10000000, --номер версии
[_Fld259], --дата 
[_Fld257],-- версии объекта
[_Fld277], --автор версии
[_Fld264], --контрольная сумма
Convert(binary(16),NEWID()) --[_SimpleKey] --
FROM  _InfoRg254
where [_Fld259]>='4017-08-01 00:00:00.000' and [_Fld259]<'4017-09-01 00:00:00.000'
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733537
Фотография leonix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leonix Т.е. добавлять такую строку в этом случае.

Т.е. НЕ добавлять такую строку в этом случае.
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733539
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leonixleonix Т.е. добавлять такую строку в этом случае.

Т.е. НЕ добавлять такую строку в этом случае.Вставлять те, где row_number ( partition by <поля, которые вы пихаете в никальный индекс> order by <порядок записей, который нравится> ) равен 1.
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733544
Фотография leonix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич, Спасибо. С ходу не осилил ваш ответ. Пойду изучать.
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733551
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leonix,

По "рабоче-крестьянски" вот так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
ALTER TABLE dbo.TableTest ADD CONSTRAINT DF_TableTest_SampleKey_DEF DEFAULT Convert(binary(16),NEWID()) FOR _SampleKey;
insert into [dbo].[_InfoRg222] (
[_Fld223],--объект 
[_Fld224], --номер версии
[_Fld251], --дата версии
[_Fld225], --версия объекта
[_Fld226], --автор версии
[_Fld232]
) 
SELECT distinct       
[_Fld276],--объект 
[_Fld256]+10000000, --номер версии
[_Fld259], --дата 
[_Fld257],-- версии объекта
[_Fld277], --автор версии
[_Fld264]
FROM  _InfoRg254;
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733563
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавить в WHERE - NOT EXISTS(SELECT * FROM ... WHERE <сравнение уникальных полей>)
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733565
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapДобавить в WHERE - NOT EXISTS(SELECT * FROM ... WHERE <сравнение уникальных полей>)Нет. Ерунду написал. Неуникальность-то появляется в источнике.
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733586
Фотография leonix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо! Буду думать. Там ещё одна проблема, в таблице приемнике есть данные и они могут быть не уникальными при заливке.
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733599
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leonix,

Ну тогда
MERGE into blah-blahblah
USING (SELECT distinct ... )

У вас токо непонятно, что собсно Primary Key
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733612
Фотография leonix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glebanskileonix,

Ну тогда
MERGE into blah-blahblah
USING (SELECT distinct ... )

У вас токо непонятно, что собсно Primary Key

Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE UNIQUE CLUSTERED INDEX [_InfoRg222_ByDims_SNT] ON [dbo].[_InfoRg222]
(
	[_Fld223] ASC,
	[_Fld224] ASC,
	[_Fld251] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733624
DaniilSeryi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А рассказывать про CHECK CONSTRAINT никто не хочет, так как предполагается,что проблем и ошибок в таблице после его использования будет больше, чем без использования?
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733625
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DaniilSeryiА рассказывать про CHECK CONSTRAINT никто не хочет, так как предполагается,что проблем и ошибок в таблице после его использования будет больше, чем без использования?
зачем? тогда уже просто drop
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733628
DaniilSeryi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKDaniilSeryiА рассказывать про CHECK CONSTRAINT никто не хочет, так как предполагается,что проблем и ошибок в таблице после его использования будет больше, чем без использования?
зачем? тогда уже просто drop


Вообще, тут сам собой напрашивается Merge - значения нет - кидаем в таблицу-приемник, значение есть - игнорируем.

Код: sql
1.
2.
3.
4.
5.
6.
merge dbo.t as target
using (select id from dbo.t2) as source (i)
on target.id=source.i
when not matched by target --вставит в таблицу-цель все строки из таблице-источника, для которых не нашлось соответствия в таблице-цели
then insert (id)
values (i);



Легко объединяется с идеей насчёт использования Row_Number()

Гавриленко Сергей Алексеевичleonixпропущено...

Т.е. НЕ добавлять такую строку в этом случае.Вставлять те, где row_number ( partition by <поля, которые вы пихаете в никальный индекс> order by <порядок записей, который нравится> ) равен 1.
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733643
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, кто так поля называет. Руки бы оторвал. В SAP-e и то понятнее.
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733645
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GlebanskiБлин, кто так поля называет. Руки бы оторвал. В SAP-e и то понятнее.
1С похоже :)
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733646
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leonix,

И да, distinct не пользуйте. Row_number лучше. с вашим
Код: sql
1.
 partition by (_Fld223, _Fld224, _Fld251 order by _Fld257 (наверное? ))
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733650
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aargh! опять чушь написал. Если у ТС уже CONSTRAINT существует на исходной таблице, то там значения по любому уникальные уже. Тогда ему у Row_number никакой не нужен и вообще дедупликация. Простой MERGE.
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733665
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MERGE сам по себе никакого преимущества по сравнению с INSERT не даёт.
SELECT из источника должен быть без дубликатов уникальных полей - применяем ROW_NUMBER(), выбираем с номером 1.
INSERT должен проверять, нет ли уже в таблице такого же значения уникальных полей, которые поставляет SELECT - применяем WHERE NOT EXISTS().
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733683
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,

У ТС там уже
Код: sql
1.
UNIQUE CLUSTERED INDEX [_InfoRg222_ByDims_SNT] ON [dbo].[_InfoRg222]
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733688
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glebanskiiap,

У ТС там уже
Код: sql
1.
UNIQUE CLUSTERED INDEX [_InfoRg222_ByDims_SNT] ON [dbo].[_InfoRg222]

Значит, у него не худший вариант. Я рад за него.
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39733838
Balbidon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для совсем ленивого решения можно пересоздать UNIQUE с указанием:

Код: sql
1.
IGNORE_DUP_KEY = ON




Быстродействие, возможно, будет еще то и структурно использование данного флага мне не нравится, но для разовой операции может и сгодиться.

Впрочем, на Azure SQL Database (ну нету обычного под рукой, извините) быстродействие не отличается:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SET STATISTICS IO ON
SET STATISTICS TIME ON

CREATE TABLE u(ai int)
CREATE TABLE nu(ai int)
GO

CREATE UNIQUE CLUSTERED INDEX idx1 ON u(ai) WITH (IGNORE_DUP_KEY = ON)
CREATE CLUSTERED INDEX idx1 ON nu(ai)
GO

INSERT INTO u select object_id from sys.objects
INSERT INTO nu select object_id from sys.objects
GO

INSERT INTO u select object_id from sys.objects
INSERT INTO nu select object_id from sys.objects
GO




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 7 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 7 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 7 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 6 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 8 ms.
Table 'u'. Scan count 0, logical reads 215, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'sysschobjs'. Scan count 1, logical reads 67, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    (107 row(s) affected)
    

    (1 row(s) affected)
    

 SQL Server Execution Times:
   CPU time = 16 ms,  elapsed time = 9 ms.
Table 'nu'. Scan count 0, logical reads 215, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'sysschobjs'. Scan count 1, logical reads 67, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    (107 row(s) affected)
    

    (1 row(s) affected)
    

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 10 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.
Table 'u'. Scan count 0, logical reads 214, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'sysschobjs'. Scan count 1, logical reads 67, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    (0 row(s) affected)
    

    (1 row(s) affected)
    

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 10 ms.
Duplicate key was ignored.
Table 'nu'. Scan count 0, logical reads 214, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'sysschobjs'. Scan count 1, logical reads 67, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    (107 row(s) affected)
    

    (1 row(s) affected)
    

 SQL Server Execution Times:
   CPU time = 15 ms,  elapsed time = 8 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.


И план одинаковый.
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39734258
Фотография leonix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо, вроде перенёс. Теперь другая проблема.
Я же нумерацию испортил, чтобы не было дублей

Код: sql
1.
[_Fld256]+10000000, --номер версии



Теперь нужно восстановить её обратно. Нумерация в рамкам "[_Fld223],--объект" и порядок по полю "[_Fld251], --дата версии".
Т.е. создать нумерацию версий по объекту по хронологии.
Понимаю что через update делать и как то прикрутить
"row_number ( partition by <поля, которые вы пихаете в никальный индекс> order by <порядок записей, который нравится> ) "
Но мало опыта. Подскажите.
...
Рейтинг: 0 / 0
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
    #39734942
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
leonix, новое поле в таблице сделайте, в нем - что хотите - восстановите.
Потом дропните предыдущее, а это новое - переименуйте.

И вообще, если таблица не очень большая, не миллиарды записей - просто пересоздайте таблицу целиком, как вам хочется.
Создайте рядом, перезалейте данные, старую сделайте _old, новую - переименуйте как старую.
С FK только не факапните.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]