В дополнение к моему вопросу "Зачем использовать" нулевой первичный ключ "в TSQL?" ...
Как я понял из других обсуждений, некоторые РСУБД (например, SQLite, MySQL) допускают "уникальный" NULL в первичном ключе.
Почему это разрешено и как оно может быть полезно?
Предпосылки: Я считаю, что полезно общаться с коллегами и профессионалами базы данных, чтобы знать различия в фундаментальных концепциях, подходах и их реализации в разных СУБД.
Примечания
- MySQL восстанавливается и возвращается в список "NOT NULL PK".
- SQLite добавлен (благодаря Полю Хэдфилду) в список "NULL PK":
В целях определения уникальности значений первичного ключа значения NULL считаются отличными от всех других значений, включая другие NULL.
Если оператор INSERT или UPDATE пытается изменить содержимое таблицы, так что две или несколько строк имеют одинаковые значения первичного ключа, это нарушение ограничения. Согласно стандарту SQL, PRIMARY KEY всегда должен подразумевать NOT NULL. К сожалению, из-за давнего контроля над кодированием это не относится к SQLite.
Если столбец не является основным ключом INTEGER, SQLite допускает значения NULL в столбце PRIMARY KEY. Мы могли бы изменить SQLite, чтобы он соответствовал стандарту (и мы могли бы сделать это в будущем), но к тому времени, когда был обнаружен контроль, SQLite был в таком широком использовании, что мы боялись сломать устаревший код, если мы исправили проблему.
Итак, теперь мы решили продолжить использование NULL в столбцах PRIMARY KEY. Однако разработчики должны знать, что мы можем изменить SQLite для соответствия стандарту SQL в будущем и соответствующим образом разработать новые программы.