Внешние ключи и 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.