Внешний ключ, который также может быть нулевым - PullRequest
10 голосов
/ 18 марта 2012

Когда я использую иностранные ключи в MySQL, я получу сообщение об ошибке, если исходное значение равно 0 (потому что нет целевой записи с идентификатором 0).Поэтому я изменяю исходный столбец на NULL, и тогда он работает.Однако я не уверен, правильно ли это сделано.Это правильный путь, или я могу как-то оставить идентификатор источника равным 0 вместо NULL?

Ответы [ 4 ]

23 голосов
/ 18 марта 2012

Внешние ключи являются ограничениями. Это означает, что если значение столбца, имеющего внешний ключ, установлено равным чему-либо (а «что-либо» не включает NULL), это значение должно существовать в ссылочной таблице, иначе MySQL выдаст ошибку.

Итак, вкратце, вы можете либо установить значение NULL, удалить ограничение внешнего ключа и установить значение по своему усмотрению, включая 0, либо добавить запись с 0 в ссылочной ссылке. Таблица. Из этих параметров установка значения NULL представляется наиболее чистой.

4 голосов
/ 18 марта 2012

использование NULL лучше нуля по двум причинам.Во-первых, более ясно, что это «специальное» значение (ничто не заставляет идентификаторы таблиц всегда быть ненулевыми, хотя это часто верно для автоматически генерируемых идентификаторов), а во-вторых, это работает в SQL с ограничением внешнего ключа.

так что то, что вы делаете, является обычной практикой - многие люди используют NULL в качестве маркера, который говорит «пропущенное значение», и именно этого ожидает ограничение внешнего ключа SQL.

другой способ обработки пропущенных значений - этоиспользовать третью таблицу «link», в которой есть запись, только если есть связь между двумя классами (как вы сделали бы в отношении «многие ко многим»).это устраняет необходимость в NULL и поэтому предпочитается некоторыми пуристами базы данных, но делает все более сложным.см. Недопустимый обнуляемый внешний ключ? для дальнейшего обсуждения.

4 голосов
/ 18 марта 2012

Это правильный путь. 0 - это значение, а ноль говорит, что в столбце ничего нет.

3 голосов
/ 18 марта 2012

Да, это правильный путь. Весь смысл FK состоит в том, чтобы обеспечить, что запись с указанным идентификатором действительно существует. Так что, если вы установите столбец FK в 0, должна быть запись с идентификатором 0.

Единственный способ обойти это - сделать столбец FK NULL, как вы это сделали.

В любом случае, почему вы хотите установить для столбца FK значение 0? Каноническое значение для «не существует» в SQL равно NULL.

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