#mysql #foreign-keys #constraints
#mysql #внешние ключи #ограничения
Вопрос:
Я действительно изо всех сил пытаюсь понять, как работают внешние ключи, хотя я вижу, что они являются очень полезным инструментом.
У меня есть таблица с именем, seasons
которая включает столбец season_id
, который является первичным ключом. Есть также несколько других столбцов.
У меня есть вторая таблица с именем, dates
которая включает столбцы с именами hid
, date
и season_id
(и несколько других). Первичный ключ содержит оба hid
и date
. season_id
имеет ограничение внешнего ключа ON DELETE SET NULL
и ON UPDATE CASCADE
.
Означает ли это, что если я удалю строку в dates
, season_id
будет установлено значение null
в seasons
? Или наоборот?
Что мне нужно, так это то, что когда я удаляю строку в dates
, seasons
это не влияет. Но если я удалю строку в seasons
, season_id
должно быть установлено значение null
в dates
.
Ответ №1:
Все наоборот. Внешний ключ определяет отношение зависимости: season_id
in dates
должен ссылаться на существующую строку в seasons
. Таким образом, вы не можете удалить строку в, seasons
если в dates
есть какие-либо строки, которые ссылаются на нее. ON DELETE
Параметр указывает, что если вы удалите строку, вы замените ссылку на нее на NULL
, чтобы сохранить это требование.
Итак, то, что вам нужно, произойдет.
Комментарии:
1. Пока все хорошо. Но когда я пытаюсь удалить дату из сезона, я сталкиваюсь с проблемой. Я хочу сохранить строку даты в таблице, но установить для season_id значение null. Запрос — это НАБОР дат ОБНОВЛЕНИЯ season_id = ‘NULL’, ГДЕ hid = ‘$ hid’ И date = ‘$value’, Однако затем я получаю сообщение об ошибке Не удается добавить или обновить дочернюю строку: не удается выполнить ограничение внешнего ключа (
lithot_extranet/dates
, ССЫЛКИ НАdates_ibfk_19
ВНЕШНИЙ КЛЮЧ (season_id
)seasons
(season_id
) ПРИ УДАЛЕНИИ ЗАДАЮТ ЗНАЧЕНИЕ NULL При КАСКАДНОМ ОБНОВЛЕНИИ)2. Не ставьте
NULL
в кавычки.3. Это так просто, когда вы знаете как! Я думаю, что я снова в процессе, поэтому зеленая галочка для Barmar. пердигейру тоже заслуживает одного, но я не знаю, допускает ли система два из них. Спасибо, ребята.
Ответ №2:
Базовое определение таково: внешний ключ — это перекрестные ссылки на связанные данные в таблицах.
В вашем случае у вас есть таблица seasons
со следующими данными (угадайте здесь) и таблица months
. Внешний ключ — это season
таблица, в которой месяц может содержать ON DELETE CASCADE
предложение, которое применит действие УДАЛЕНИЯ к записям, затронутым удалением сезона. Итак, если вы удалите Winter из таблицы seasons
, записи с соответствующим внешним ключом 1 будут удалены, и мы потеряем Рождество.
season_id --- season_name || month_id --- season --- month_name
1 --- Winter || 1 --- 1 January
2 --- Spring || ...
3 --- Summer || 7 --- 3 July
4 --- Autumn || 8 --- 4 September