Внешние ключи и NULL в mySQL
Могу ли я иметь столбец в моей таблице значений (значение), на который ссылается как внешний ключ в таблицу 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
Таблица: knownValues
id Type name
0 2 banana
Примечание. Типы в таблице values
и knownValues
, конечно, ссылаются на таблицу types
.
Ответы
Ответ 1
NULL во внешних ключах вполне приемлемы. Работа с NULL во внешних ключах сложна, но это не означает, что вы меняете такие столбцы на NOT NULL и вставляете фиктивные ( "N/A", "Unknown", "No Value" и т.д.) Записи в ваши справочные таблицы.
Использование NULL во внешних ключах часто требует использования LEFT/RIGHT JOIN вместо INNER JOIN.
Ответ 2
Хотя вы можете сделать столбцы внешнего ключа обнуляемыми, я бы предположил, что лучше создавать таблицы без нулевых внешних ключей. Нули неизменно приводят к определенным неоднозначностям и неправильным результатам, но это вдвойне проблема, если ожидается, что рассматриваемые столбцы будут подвержены некоторому ограничению.
Ответ 3
Это отношение 1 к нулю ко многим. Я использовал это много раз с SQL Server. Я считаю, что это можно сделать и с MySQL.
Я предпочитаю избегать NULL в моих базах данных из-за проблем, связанных с агрегацией данных, поэтому, в зависимости от моего дизайна, я помещаю строку UNKNOWN в таблицу поиска.
Ответ 4
Да, вполне возможно иметь NULL в столбце с ограничениями по внешнему ключу. Я просто попробовал. Имейте в виду, что если вы не используете движок хранения InnoDB, ваши ограничения внешнего ключа в любом случае будут игнорироваться.
Ответ 5
Конечно, есть возможности ti иметь значения NULL во внешнем ключе, но для этого вы не беспокоитесь об этом, я надеюсь, вы можете использовать InnoDB в качестве механизма базы данных для управления ограничениями Key. В этом случае я предлагаю использовать Left Join или Right Join для получения строк из БД, а Group By можно использовать для предотвращения дублирования. Пожалуйста, не используйте Inner Join.