Можно ли изменить уникальное ограничение в sql? - PullRequest
0 голосов
/ 11 апреля 2020

Я использую уникальное ограничение для избежания дубликатов, кроме нулевых значений, потому что этот столбец может оставаться пустым (это необязательное поле, но оно помогает при поиске, например при поиске по электронной почте и т. Д. c)

В описанной выше ситуации, Правильно ли выбрать уникальное ограничение или нет?

Альтернатива Поскольку уникальное допускает только одно нулевое значение, поэтому можно генерировать различные значения по умолчанию для уникального ограничения? т.е. уникальный для каждого ряда.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Вы пометили вопрос как и , поэтому я рассмотрю оба.

SQLite

В SQLite, a УНИКАЛЬНОЕ ограничение будет работать так, как вы хотите.

Документация для УНИКАЛЬНОЕ ограничение гласит:

Для целей УНИКАЛЬНЫХ ограничений учитываются значения NULL. отличается от всех других значений, включая другие NULL .

Документация для CREATE INDEX гласит:

Если ключевое слово UNIQUE появляется между CREATE и INDEX, тогда повторяющиеся записи индекса не допускаются. Любая попытка вставить повторяющуюся запись приведет к ошибке. Для целей уникальных индексов все значения NULL считаются отличными от всех других значений NULL и поэтому являются уникальными. Это одна из двух возможных интерпретаций стандарта SQL -92 (язык в стандарте неоднозначен) и является интерпретацией, за которой следуют PostgreSQL, MySQL, Firebird и Oracle. Informix и Microsoft SQL Server следуют другой интерпретации стандарта.

Однако в большинстве других баз данных столбцы ограничения UNIQUE не могут быть равны NULL, поэтому я рекомендую использовать вместо них UNIQUE INDEX , для согласованности и чтобы не вводить людей в заблуждение.

MySQL

В MySQL уникальное ограничение будет работать так, как вы хотите.

Документация для Уникальные индексы говорит:

A UNIQUE index разрешает множественные NULL значения для столбцов, которые могут содержать NULL.

УНИКАЛЬНЫЙ КЛЮЧ является синонимом УНИКАЛЬНОГО ИНДЕКСА.

SQL Сервер

Как упоминалось в документации по SQLite, Microsoft SQL Сервер придерживается иной интерпретации обработки NULL. для уникальных индексов.

Документация для UNIQUE INDEX гласит:

Столбцы, которые используются в уникальном индексе, должны быть установлены в NOT NULL, потому что множественные нулевые значения считаются du применяется при создании уникального индекса.

Чтобы обойти это, используйте отфильтрованный индекс, например,

CREATE UNIQUE INDEX Person_Email
    ON Person ( Email )
    WHERE Email IS NOT NULL;
0 голосов
/ 11 апреля 2020

Вы можете использовать трюк с сгенерированными столбцами. Примерно так:

alter table t add unique_val as
     ( concat(coalesce(col, ''), ':', (case when col is null then pk end))  ) unique;

Где pk - это столбец первичного ключа.

Это заменяет значения NULL чем-то, что известно как уникальное в каждой строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...