Ответ 1
В то время как следующие адреса имеют несколько нулевых значений, он не затрагивает никаких "проблем", связанных с таким дизайном, помимо возможной переносимости базы данных /SQL - как таковой, он, вероятно, не должен считаться ответом и оставлен здесь просто для справки.
Это действительно рассматривается в FAQ по SQLite. Это выбор дизайна. SQLite (в отличие от SQL Server) выбрал, что несколько значений NULL не учитывают уникальность в индексе.
Возможно, вы ссылаетесь на следующий оператор SQL92:
- Уникальное ограничение выполняется тогда и только тогда, когда две строки в таблице не имеют одинаковых ненулевых значений в уникальных столбцах.
Это утверждение неоднозначно, имея как минимум две возможные интерпретации:
Уникальное ограничение выполняется тогда и только тогда, когда две строки в таблице не имеют одинаковых значений и имеют непустые значения в уникальных столбцах.
Единственное ограничение выполняется тогда и только тогда, когда две строки в таблице не имеют одинаковых значений в подмножестве уникальных столбцов, которые не являются нулевыми.
SQLite следует интерпретации (1), как и PostgreSQL, MySQL, Oracle и Firebird. Верно, что Informix и Microsoft SQL Server используют интерпретацию (2), однако разработчики SQLite считают, что интерпретация (1) является наиболее естественным показанием этого требования, и мы также хотим максимизировать совместимость с другими механизмами СУБД SQL, а большинство других двигатели баз данных также идут с (1), так что это делает SQLite.