MySQL: UNIQUE, но DEFAULT NULL - допускается при создании таблицы. Допускается вставлять более 1 NULL. Зачем? - PullRequest
7 голосов
/ 16 ноября 2011

Я только что проверил, и разрешено создавать таблицу со столбцом, который по умолчанию равен NULL, хотя в то же время это УНИКАЛЬНЫЙ КЛЮЧ:

CREATE TABLE IF NOT EXISTS `u789` (
`column1` varchar(10) DEFAULT NULL,
UNIQUE KEY (column1)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Как я понимаю, это выглядит страннои не имеет большого смысла.Я ожидал, что вторая вставка

INSERT INTO u789 VALUE (NULL);

завершится неудачей.

Но он вставляет первое, второе, третье значение NULL без каких-либо проблем.Кто может объяснить мне, почему он выводит второй и третий столбцы, если NULL уже есть в таблице?

Это теоретический вопрос (как я понимаю, никто не использует DEFAULT NULL + UNIQUE KEY для одного и того же столбца в большинстве ситуаций), но я хочу понять, почему он не выдает ошибку, если один NULL уже находится вколонка.Я делаю что-то не так с объявлением уникального столбца?

Спасибо.

Ответы [ 2 ]

21 голосов
/ 16 ноября 2011

В соответствии со спецификацией SQL 92 (и тем, как вы ее читаете) уникальные ограничения предназначены для обозначения ключей-кандидатов и поэтому не должны допускать повторяющихся значений или NULL. DB2 реализует свои уникальные ограничения таким образом. Более нескольких поставщиков баз данных (включая MySQL) читают спецификацию как игнорирующую значения NULL, так же как предложение Group By игнорирует значения NULL и, таким образом, реализуют уникальные ограничения, так что она применяется только к значениям, отличным от NULL. Третьи считают NULL своим собственным специальным значением и разрешают только одну запись, которая равна NULL. Microsoft SQL Server реализует уникальные ограничения таким образом. Единственный аспект, который является единым для всех поставщиков в отношении уникальных ограничений, заключается в том, что значения, отличные от NULL, должны быть уникальными.

6 голосов
/ 16 ноября 2011

Потому что NULL не равно NULL. Хотя некоторые RDMS, например SQLServer, обрабатывают 2 NULL s как равные, когда речь идет об уникальных ограничениях.

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