В postgres, могу ли я каким-то образом определить нулевые значения как часть ограничения уникальности - PullRequest
0 голосов
/ 14 июля 2020

Мне любопытно, есть ли здесь у MySQL метод.

У нас есть ТОННА разреженных таблиц (индустрия здравоохранения может быть немного проблемной в этом отношении) с тонной столбцов, которые может иметь значение null (или не иметь значения / неизвестно. Наш микросервис поверх БД - java, который поддерживает нулевые значения (или для нас не существует). Мы также используем спящий режим, который предварительно компилирует @NamedQuery JQL в SQL вперед времени (поэтому невозможно перевести u.col =: col во время перевода запроса, чтобы включить u.col is null по сравнению с u.col = null). Это означает, что hibernate генерирует u.col = null, что на самом деле не SQL совместимый (что действительно очень плохо, так как это было бы очень приятно и было источником путаницы для каждого разработчика, которого мы нанимаем ... даже некоторых старших разработчиков. Я не понимаю, почему они просто не устраняют путаницу там - в по крайней мере, для языков с нулевыми значениями это было бы хорошо).

У нас в качестве примера (но обычно больше 5/6 столбцов)

firstName, middleName, lastName

, и я думаю, что это будет ясно мы не хотим

John null Smith 
* 1 010 * дважды в базе. В этом нет никакого смысла. К сожалению, у нас может быть 2/3 столбца с нулями. Таким образом, стандарт SQL позволяет нам иметь тонны дубликатов и ЗНАТЬ, какие значения могут быть нулевыми, ЗАРАНЕЕ (мы просто не знаем, поскольку каждый клиент продолжает сталкиваться с уникальными ситуациями, когда внезапно один из этих столбцов имеет значение null).

Это означает, что выполнение чего-то вроде ПЕРВОГО ответа в этом сообщении ниже не очень полезно для нас (так как вы должны знать ВСЕ ситуации заранее) ...

Создать уникальное ограничение с нулевыми столбцами

(У него там отличный ответ !!) Увы, нам придется угадывать, и это будет неверно. Есть ли способ указать postgres создать индекс для 5 столбцов и сделать так, чтобы значения NULL были уникальными, а не несовпадающими.

Другой способ - использовать КАЖДОЕ значение в postgres по умолчанию до строки длины 0 . Я не уверен, как postgres к ним относится. Я помню, что oracle рассматривал это как null.

Есть идеи, как бороться с postgres здесь? Есть ли в MySQL что-то, что тоже может это исправить?

спасибо, Дин

1 Ответ

2 голосов
/ 14 июля 2020

Вы не можете изменить семантику NULL в уникальных ограничениях.

Но в PostgreSQL вы можете использовать уникальный индекс, который обрабатывает NULL как пустые строки:

CREATE UNIQUE INDEX ON the_table (
   coalesce(firstname, ''),
   coalesce(middlename, ''),
   coalesce(lastname, '')
);

Это должно делай именно то, что хочешь.

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