Внешний ключ MySQL, чтобы позволить NULL? - PullRequest
64 голосов
/ 14 января 2009

Я соединяю сайт с изображениями. Базовая схема довольно простая MySQL, но у меня возникают некоторые проблемы при попытке представить возможные флаги администратора, связанные с изображением («неуместно», «защищено авторским правом» и т. Д.). Мое нынешнее представление таково:

tblImages (
    imageID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    ...
);

tblImageFlags (
    imageFlagID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    imageID INT UNSIGNED NOT NULL,
    flagTypeID INT UNSIGNED NOT NULL,
    resolutionTypeID INT UNSIGNED NOT NULL,
    ...
);

luResolutionTypes (
    resolutionTypeID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    resolutionType VARCHAR(63) NOT NULL,
    ...
);

(усечено для удобства чтения; разные внешние ключи и индексы в порядке, клянусь)

tblImageFlags.flagTypeID имеет внешний ключ в таблице поиска типов флагов, и, как вы можете себе представить, tblImageFlags.resolutionTypeID должен иметь внешний ключ на luResolutionTypes.resolutionTypeID. Проблема заключается в том, что при первом введении флага не существует логического типа разрешения (я бы объявил это хорошим использованием NULL); однако, если значение установлено, оно должно быть внешним ключом к таблице поиска.

Я не могу найти обходной путь синтаксиса MySQL в этой ситуации. Это существует? Лучшие призеры:

  • Добавить «немодерируемый» тип разрешения
  • Добавить запись NULL к luResolutionTypes.resolutionTypeID (будет ли это работать даже в столбце AUTO_INCREMENT?)

Спасибо за понимание!

PS Бонус указывает на то, кто мне скажет, в случае баз данных это "индексы" или "индексы".


Продолжение : спасибо Биллу Карвину за то, что он указал на то, что оказалось синтаксической ошибкой в ​​структуре таблицы (не устанавливайте столбец в NOT NULL, если вы хотите, чтобы он позволял NULL!). И как только у меня будет достаточно кармы, чтобы дать вам эти бонусные очки, я буду:)

1 Ответ

97 голосов
/ 14 января 2009

Вы можете решить эту проблему, указав NULL в столбце внешнего ключа tblImageFlags.resolutionTypeID.


PS Бонус указывает тому, кто мне скажет, в случае баз данных это "индексы" или "индексы".

Множественное число index должно быть indexes .

Согласно « Современное американское использование » Брайана А. Гарнера:

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

...