Bolevar
@Bolevar
Хобби: веб-разработка

Как добавить FOREIGN KEY, если поле может быть NULL?

Есть три MySQL InnoDB таблицы `country`, `region`, `city`. В каждой из них хранятся строки: страны, федеральные административные округи/области и города/населённые пункты соотвественно. Требуется связать таблицы внешними ключами.

У таблицы `country` поля:
  • 'id' (primary key); // порядковый ID
  • 'title' (string); // название государства


У таблицы `region` поля:
  • 'id' (primary key); // порядковый ID
  • 'country_id' (integer, notNull); // ID государства `country`.`id`
  • 'title' (string); // название округа/области


У таблицы `city` поля:
  • 'id' (primary key); // порядковый ID
  • 'country_id' (integer, notNull); // ID государства `country`.`id`
  • 'region_id' (integer, Null); // ID округа/области `region`.`id`
  • 'title' (string); // название города/населенного пункта


Вопрос в следующем. Как правильно добавить связь (FOREIGN KEY) главной `city` к зависимой `region` таблице, если поле `city`.`region_id` может быть NULL, например для Москва, Санкт-Петербург (не входит в состав областей), являясь самостоятельными субъектами Российской Федерации, и как следствии не должны быть привязаны к `region`.`id`?

Ведь при добавлении таких записей в таблицу `city` у таблицы `region` нет соответствующей записи с `region`.`id` = NULL, выводится ошибка:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`city`, CONSTRAINT `fk_city_to_region` FOREIGN KEY (`region_id`) REFERENCES `region` (`id`) ON DELETE CASCADE)
The SQL being executed was: INSERT INTO `city` (`country_id`, `region_id`, `title`) VALUES (109, 0, 'Москва')
  • Вопрос задан
  • 70 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
INSERT INTO `city` (`country_id`, `region_id`, `title`) VALUES (109, 0, 'Москва')

А вот если вы попробуете писать NULL вместо вот этого - то всё получится и именно так FK и работает, допуская использование NULL.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы