Нарушение ограничения УНИКАЛЬНОГО КЛЮЧА на пустой указатель

Исключение:

Violation of UNIQUE KEY constraint 'UQ__user_dat__AB6E61641273C1CD'. Cannot insert duplicate key in object 'dbo.user_data'.
The statement has been terminated.

AB6E61641273C1CD = электронная почта, которая является уникальной и ПУСТОЙ

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

В чем проблема? Код работал в sqlite отлично.

5
задан 21 May 2010 в 19:19
поделиться

6 ответов

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

  • индексированный -- представление с предложением where, которое удаляет нули
  • вычисляемый столбец -- ограничение на операторе case, который преобразует нули в PK
  • триггер -- триггер делает то же самое, что и уникальное ограничение, но игнорирует нули
  • нормализация -- поместите данные в другую таблицу, где для нулей не существует строк

Кроме того, в ответе AlexKuznestov отмечается, что в SQL 2008 вы можете предоставить фильтрованный индекс.

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

5
ответ дан 18 December 2019 в 08:27
поделиться

Уникальное ограничение допускает только 1 нулевое значение в SQL Server, Oracle, например, допускает много NULLS

пример

create table test (id int)


CREATE UNIQUE NONCLUSTERED INDEX [IX_test] ON [dbo].[test] 


insert test values(NULL)

--will fail
insert test values(NULL)

Msg 2601, Level 14, State 1, Line 1 Невозможно вставить дублирующую ключевую строку в объект 'dbo.test' с уникальным индексом 'IX_test'. Оператор был прерван.

1
ответ дан 18 December 2019 в 08:27
поделиться

Вероятно, у вас уже есть строка с нулевым значением в столбце электронной почты.

0
ответ дан 18 December 2019 в 08:27
поделиться

В SQL Server 2008 вместо этого можно использовать отфильтрованный индекс. SQL Server 2005 используйте индексированное представление.

5
ответ дан 18 December 2019 в 08:27
поделиться

Если вы используете SQL 2008, вы можете использовать отфильтрованный индекс, как предлагается здесь .

create unique nonclustered index idx on dbo.DimCustomer(emailAddress)
where EmailAddress is not null;
7
ответ дан 18 December 2019 в 08:27
поделиться

SQL Menace прав на 100%, если вы установите уникальный ключ на столбец, но разрешите нули, только один нуль разрешен в этом столбце для всех строк в таблице.

Пример:

Column with unique key
1
2
3
NULL
4

Чтобы столбец был уникальным, я могу ввести что угодно, кроме 1,2,3,4 или NULL

1
ответ дан 18 December 2019 в 08:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: