Внешние ключи и NULL в MySQL - PullRequest
16 голосов
/ 10 мая 2010

Могу ли я иметь столбец в моей таблице значений (значение), ссылающийся как внешний ключ к таблице knownValues, и позволять ему быть NULL при необходимости, как в примере:

Таблица: значения

 product     type     value     freevalue
 0           1        NULL      100
 1           2        NULL      25
 3           3        1         NULL

Таблица: типы

 id    name     prefix
 0     length   cm
 1     weight   kg
 2     fruit    NULL

Таблица: известные значения

id    Type     name
0     2        banana 

Примечание. Типы в таблице values & knownValues, конечно, относятся к таблице types.

Ответы [ 5 ]

21 голосов
/ 10 мая 2010

NULL в внешних ключах вполне приемлемы. Работать с NULL во внешних ключах довольно сложно, но это не означает, что вы изменяете такие столбцы на NOT NULL и вставляете фиктивные ("N / A", "Unknown", "No Value" и т. Д.) Записи в свои справочные таблицы.

Использование NULL во внешних ключах часто требует использования LEFT / RIGHT JOIN вместо INNER JOIN.

6 голосов
/ 10 мая 2010

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

4 голосов
/ 10 мая 2010

Это отношение от 1 до 0. Я использовал это много раз с SQL Server. Я считаю, что это можно сделать и с MySQL.

Я предпочитаю избегать значений NULL в моих базах данных из-за проблем, связанных с агрегацией данных, поэтому, в зависимости от моего дизайна, я помещаю строку UNKNOWN в таблицу поиска.

1 голос
/ 10 мая 2010

Конечно, есть вероятность, что во внешнем ключе могут быть значения NULL, но для этого вам не стоит беспокоиться об этом, я надеюсь, что вы можете использовать InnoDB в качестве механизма базы данных для управления ограничениями Key. Для этого случая я предлагаю использовать левое соединение или правое соединение, чтобы получить строки из БД, а Group By можно использовать для избежания дублирования. Пожалуйста, не используйте Inner Join.

1 голос
/ 10 мая 2010

Да, вполне возможно иметь значение NULL в столбце, ограниченном внешним ключом. Я только что попробовал это. Помните, что если вы не используете механизм хранения InnoDB, ваши ограничения внешнего ключа все равно будут игнорироваться.

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