Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec / 23 сообщений из 23, страница 1 из 1
15.11.2018, 14:24
    #39733536
leonix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
Переношу данные из одной таблицы в другую. Вылетает ошибка о том что пытаюсь вставить не уникальное значение в уникальный индекс. Как это можно обойти. Т.е. добавлять такую строку в этом случае.
Ниже запрос.
Код: 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
15.11.2018, 14:26
    #39733537
leonix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
leonix Т.е. добавлять такую строку в этом случае.

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

Т.е. НЕ добавлять такую строку в этом случае.Вставлять те, где row_number ( partition by <поля, которые вы пихаете в никальный индекс> order by <порядок записей, который нравится> ) равен 1.
...
Рейтинг: 0 / 0
15.11.2018, 14:32
    #39733544
leonix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
Гавриленко Сергей Алексеевич, Спасибо. С ходу не осилил ваш ответ. Пойду изучать.
...
Рейтинг: 0 / 0
15.11.2018, 14:41
    #39733551
Glebanski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
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
15.11.2018, 14:51
    #39733563
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
Добавить в WHERE - NOT EXISTS(SELECT * FROM ... WHERE <сравнение уникальных полей>)
...
Рейтинг: 0 / 0
15.11.2018, 14:52
    #39733565
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
iapДобавить в WHERE - NOT EXISTS(SELECT * FROM ... WHERE <сравнение уникальных полей>)Нет. Ерунду написал. Неуникальность-то появляется в источнике.
...
Рейтинг: 0 / 0
15.11.2018, 15:10
    #39733586
leonix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
Всем спасибо! Буду думать. Там ещё одна проблема, в таблице приемнике есть данные и они могут быть не уникальными при заливке.
...
Рейтинг: 0 / 0
15.11.2018, 15:29
    #39733599
Glebanski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
leonix,

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

У вас токо непонятно, что собсно Primary Key
...
Рейтинг: 0 / 0
15.11.2018, 15:42
    #39733612
leonix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
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
15.11.2018, 15:57
    #39733624
DaniilSeryi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
А рассказывать про CHECK CONSTRAINT никто не хочет, так как предполагается,что проблем и ошибок в таблице после его использования будет больше, чем без использования?
...
Рейтинг: 0 / 0
15.11.2018, 15:59
    #39733625
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
DaniilSeryiА рассказывать про CHECK CONSTRAINT никто не хочет, так как предполагается,что проблем и ошибок в таблице после его использования будет больше, чем без использования?
зачем? тогда уже просто drop
...
Рейтинг: 0 / 0
15.11.2018, 16:06
    #39733628
DaniilSeryi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
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
15.11.2018, 16:21
    #39733643
Glebanski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
Блин, кто так поля называет. Руки бы оторвал. В SAP-e и то понятнее.
...
Рейтинг: 0 / 0
15.11.2018, 16:22
    #39733645
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
GlebanskiБлин, кто так поля называет. Руки бы оторвал. В SAP-e и то понятнее.
1С похоже :)
...
Рейтинг: 0 / 0
15.11.2018, 16:24
    #39733646
Glebanski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
leonix,

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

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

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

Значит, у него не худший вариант. Я рад за него.
...
Рейтинг: 0 / 0
16.11.2018, 00:59
    #39733838
Balbidon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
Для совсем ленивого решения можно пересоздать 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
16.11.2018, 16:38
    #39734258
leonix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку попытки вставки не уникального значения в индекс через insert into selec
Всем спасибо, вроде перенёс. Теперь другая проблема.
Я же нумерацию испортил, чтобы не было дублей

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



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

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


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