Проблема ограничения уникальных ключей - MySQL, SQL Server, Oracle, Postgres - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть таблица сотрудников, которая имеет 10 столбцов, и я должен создать ограничение уникального ключа для идентификатора, имени, адреса, мобильного телефона

В приведенном выше случае адрес может быть нулевым, а мобильный - нулевым,Однако, когда они приходят, уникальность должна быть сохранена.

сначала я создал уникальное ограничение, объединив все вышеперечисленные ключи и соблюдая следующее.

Фактическое поведение в MySQL.

   001-Thiagu-NULL-900000 - Accepted
   001-Thiagu-NULL-900000 - Accepted
   001-Thiagu-0001-900000 - Accepted
   001-Thiagu-0001-900000 - Rejected - Duplicate Record

Ожидаемое поведение во всех базах данных

   001-Thiagu-NULL-900000 - Accepted
   001-Thiagu-NULL-900000 - Rejected - Duplicate Record
   001-Thiagu-0001-900000 - Accepted
   001-Thiagu-0001-900000 - Rejected - Duplicate Record

По сути, аналогичное должно учитываться при дублировании независимо от того, существует ли значение как NULL или Нет.

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

По одной вставке каждой записи, которую я вручную строю и даюзначение на любой вставке, чтобы сохранить уникальность.

Это будет правильный подход или любой другой способ исправить в первом выше подходе, который я не уверен.

Созданныйограничение должно работать для MySQL, SQL Server, Oracle и Postgres.

1 Ответ

0 голосов
/ 13 декабря 2018

В SQL ноль никогда не равен нулю.Это не ошибка, это особенность.NULL НЕ ОТЛИЧАЕТСЯ ОТ NULL имеет значение true, но в декларациях ключей используется '=' [в эквивалентных длинных руках], а не НЕ ОТЛИЧАЕТСЯ от.Требуемое ограничение «key» должно использовать IS NOT DISTINCT FROM, поэтому вы не можете получить его, объявив ключи.

Следующим вариантом будет ограничение CHECK, но продукты вряд ли будут поддерживать ограничения CHECK для доступа к другим строкам.чем вставляемый.

Следующим вариантом будет создание ASSERTION, но ни один продукт не поддерживает это [надежно], по сути по той же причине, по которой они не поддерживают ограничения CHECK для нескольких строк.

Следующий вариант - применить это в хранимой процедуре, но тогда вы, вероятно, натолкнетесь на [некоторые из] продуктов, говорящих только на собственном диалекте языка SQL / PSM.

следующая опция - код приложения.

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