Понимание ограничений внешнего ключа в MYSQL

#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