(TSQL) уникальный индекс в разреженном пустом столбце nvarchar (200) - PullRequest
2 голосов
/ 01 ноября 2010

Я столкнулся с запутанной проблемой. Если вы создадите таблицу, подобную следующей, вы получите ошибку:

CREATE TABLE t
(
 a NVARCHAR(100) SPARSE
                 NULL UNIQUE
)

Msg 1919, Level 16, State 2, Line 1
Column 'a' in table 't' is of a type that is invalid for use as a key column in an index.
Msg 1750, Level 16, State 0, Line 1
Could not create constraint. See previous errors.

Но если сначала создать таблицу, а затем создать такой уникальный индекс, все будет работать.

CREATE TABLE t
(

 a NVARCHAR(100) SPARSE
                 NULL
)

CREATE UNIQUE NONCLUSTERED INDEX t_a ON dbo.t
(
a
)

Кто-нибудь может помочь мне объяснить это, пожалуйста?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 01 ноября 2010

Не знаю почему, но из MSDN SPARSE столбцы

Разреженный столбец не может быть частью кластерного индекса или уникального индекса первичного ключа.

Теперь, в предположительную землю ...

Это имеет смысл, поскольку ограничение UNIQUE не может быть отфильтровано, тогда как явный индекс может. Следовательно, ограничение UNIQUE запрещено, но разрешено через CREATE INDEX, где у вас есть скрытый фильтр.

Я бы также сказал, что запрещено для кластеризованных индексов, потому что каждый некластеризованный индекс ссылается на кластеризованный индекс + кластерные индексы должны быть внутренне уникальными, если не явным образом («унивификатор»). Так что каждая строка должна существовать.

Взятые вместе, у вас должно быть что-то уникальное и / или кластерное: что лишает смысла использовать SPARSE ... нет?

1 голос
/ 01 ноября 2010

Вы пытаетесь это сделать, но:

CREATE TABLE t 
( 
     a NVARCHAR(100) SPARSE NULL 
         CONSTRAINT t_a UNIQUE NONCLUSTERED (a)
) 

... вы не можете создать уникальный индекс для столбца со многими значениями NULL.Для этого вам нужно создать фильтрованный индекс.т.е.

CREATE NONCLUSTERED INDEX t_a ON dbo.t(a) 
WHERE a IS NOT NULL
0 голосов
/ 01 ноября 2010

Совершенно странно, что вы можете создать индекс в отдельном операторе, но не в таблице create.

Возможно, причина в том, что создавать уникальный индекс не имеет большого смысларедкий столбец.Весь смысл разреженного столбца в том, чтобы эффективно хранить null, а уникальный индекс позволял бы только одну строку с null!

insert t values (null)
insert t values (null)
-->

Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'dbo.t' with unique index 't_a'.
The statement has been terminated.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...