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

Откуда: Сидней
Сообщений: 1197
Добрый день,

Есть таблица, первичный ключ которой был изменен добавлением даты, которая используется для партицирования. Теперь, когда этот ключ имеет два столбца, уникальность первого столбца не гарантируется.

Попробовал создать уникальную контсрейнт на этом столбце:

ALTER TABLE dbo.MyTable
ADD CONSTRAINT AK_MyTableIDUNIQUE (MyTableID); 


Выдает ошибку:
Msg 1908, Level 16, State 1, Line 1
Column 'PDate' is partitioning column of the index 'AK_MyTableID'. Partition columns for a unique index must be a subset of the index key.
Msg 1750, Level 16, State 0, Line 1
Could not create constraint. See previous errors.

Я раньше думал, что это ограничение касается только индексов.

Поделитесь, пжлста, как можно вернуть уникальность первому столбцу без удаления партицирования?

Спасибо.
24 июн 15, 08:36    [17809413]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная констрейнт на партицированной таблице  [new]
o-o
Guest
Roust_m,

Про то, как добавление второго столбца к первому уникатьному отобрало у него уникальность это ерунда конечно, но ошибка про другое, там пишут, что раз таблица секционирована, то надо поле, по к-ому секционировали, явно добавить в ключ индекса, т. е. от вас хотят (mytableid, pdate)
24 июн 15, 08:47    [17809440]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная констрейнт на партицированной таблице  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1197
Как же ерунда, если раньше я мог вставить только уникальные IDs: 1,2,3
То сейчас могу вставить несколько единиц с разными датами: 1/20150607, 1/20150608, 1/20150609
24 июн 15, 08:52    [17809449]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная констрейнт на партицированной таблице  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1197
o-o
Roust_m,

Про то, как добавление второго столбца к первому уникатьному отобрало у него уникальность это ерунда конечно, но ошибка про другое, там пишут, что раз таблица секционирована, то надо поле, по к-ому секционировали, явно добавить в ключ индекса, т. е. от вас хотят (mytableid, pdate)



А включение столбца даты в констрейнт мне не катит, ибо у меня уже PK есть на этих двух столбцах, вот только ID перестал быть уникальным.
24 июн 15, 08:53    [17809455]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная констрейнт на партицированной таблице  [new]
o-o
Guest
При секционировании по-другому не выйдет, сервер гарантирует уникальность только внутри партиции, ваш пример рассовывает по разным партициям. Только триггером значит глобальную уникальность можете обеспечить
24 июн 15, 09:14    [17809511]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная констрейнт на партицированной таблице  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1197
o-o
При секционировании по-другому не выйдет, сервер гарантирует уникальность только внутри партиции, ваш пример рассовывает по разным партициям. Только триггером значит глобальную уникальность можете обеспечить


Он даже внутри партиции ничего не гарантирует, ибо если таблица партицирована по месяцам, в каждой партиции может быть до 31 записи с одним и тем же ID, но разными датами.
24 июн 15, 09:16    [17809525]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная констрейнт на партицированной таблице  [new]
o-o
Guest
Roust_m
Он даже внутри партиции ничего не гарантирует, ибо если таблица партицирована по месяцам, в каждой партиции может быть до 31 записи с одним и тем же ID, но разными датами.

внутри партиции как раз и гарантирует.
ну и что по месяцам
у меня 2 партиции, 201501 и 201502,
уникальный индекс на (id, yyyymm).
если вы вставите (1, 20150101), то никакого уже (1, 20150102),
ведь у них одинаковый месяц и (1, 201501) уже есть
---------------------------

Partitioning Unique Indexes

When partitioning a unique index (clustered or nonclustered), the partitioning column must be chosen from among those used in the unique index key.

Note

This restriction enables SQL Server to investigate only a single partition to make sure no duplicate of a new key value already exists in the table.

If it is not possible for the partitioning column to be included in the unique key, you must use a DML trigger instead to enforce uniqueness.
Special Guidelines for Partitioned Indexes
24 июн 15, 09:59    [17809770]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная констрейнт на партицированной таблице  [new]
Владислав Колосов
Member

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

Для соблюдения глобальной уникальности создайте отдельный индекс. Индекс будет не секционированным, разумеется.
24 июн 15, 13:03    [17810884]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная констрейнт на партицированной таблице  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1197
o-o
Roust_m
Он даже внутри партиции ничего не гарантирует, ибо если таблица партицирована по месяцам, в каждой партиции может быть до 31 записи с одним и тем же ID, но разными датами.

внутри партиции как раз и гарантирует.
ну и что по месяцам
у меня 2 партиции, 201501 и 201502,
уникальный индекс на (id, yyyymm).
если вы вставите (1, 20150101), то никакого уже (1, 20150102),
ведь у них одинаковый месяц и (1, 201501) уже есть
---------------------------

Partitioning Unique Indexes

When partitioning a unique index (clustered or nonclustered), the partitioning column must be chosen from among those used in the unique index key.

Note

This restriction enables SQL Server to investigate only a single partition to make sure no duplicate of a new key value already exists in the table.

If it is not possible for the partitioning column to be included in the unique key, you must use a DML trigger instead to enforce uniqueness.
Special Guidelines for Partitioned Indexes


Внутри партиции на месяц есть дни и дата это не год и месяц, а год, месяц и день.
25 июн 15, 02:26    [17813489]     Ответить | Цитировать Сообщить модератору
 Re: Уникальная констрейнт на партицированной таблице  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1197
Владислав Колосов
Roust_m,

Для соблюдения глобальной уникальности создайте отдельный индекс. Индекс будет не секционированным, разумеется.


Тоже не очень подходит, ибо это затрудняет архивирование. Нужно будет этот индекс удалять и пересоздавать, каждый раз, когда нужно сделать switch partition.
25 июн 15, 02:27    [17813490]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить