Кажется, что в SQL Server уникальные индексы обрабатывают NULL как «просто еще одно значение», а не как в остальной части SQL, где сравнения с NULL возвращают NULL.
Скажем, у вас есть таблица (t
) с уникальным индексом для столбца, допускающего значение NULL, K
:
K V
0 32
1 12
3 45
Все хорошо.
Но это также позволит
K V
0 32
1 12
3 45
NULL 89 <-- Baaad
И наоборот, также позволит следующее:
K V
NULL 89
0 32 <-- not good
Я вижу, что это может быть потенциальной катастрофой, поскольку я использую значения ключа NULL для представления значений, где дальнейшая разбивка невозможна - наличие общего количества и разбивки приводит к двойному счету или несогласованности.
Я могу найти, по-видимому, тысячи вопросов, в которых люди хотят сделать обратное (разрешить несколько NULL), но ни один из них не хочет рассматривать NULL как NULL.
Как я могу заставить SQL Server рассматривать значения NULL как значения NULL (и разрешать только одно значение NULL или любое количество уникальных значений в столбце) в уникальном индексе?
NULL
в столбце с уникальным ограничением. Другие СУБД (которые в данном случае соответствуют стандарту) допускают более одного значения Null. Вы можете обойти это, создав уникальный частичный индекс, но я не думаю, что это ваша цель. Не совсем понятно, какова ваша цель на самом деле. - person ypercubeᵀᴹ   schedule 01.05.2013NULL
должно даватьNULL
, поэтому, если столбец содержит только одноNULL
, все сравнения с любым другим значением (включаяNULL
) должны завершиться неудачно. Я вижу, как может быть полезно быть «оптимистичным» и предполагать, чтоNULL
s представляют неизвестные, которые уникальны, но в моем случае это было бы пессимистично и обеспечивало бы целостность базы данных. - person Fowl   schedule 01.05.2013NULL
даетUNKNOWN
, а неNULL
. Это незначительная гнида, но если бы у нас был логический тип данных в SQL, мы ожидали бы, что сможем установить для столбца этого типа значениеTRUE
,FALSE
,UNKNOWN
или (если бы он допускал значение NULL)NULL
. Только (насколько мне известно) MySQL объединяетNULL
иUNKNOWN
. - person Damien_The_Unbeliever   schedule 01.05.2013