Настройка табличных отношений, что делают "Cascade", "Set Null" и "Restrict"?
Я хочу начать использовать отношения таблиц в новом проекте.
После некоторого googling я получил 2 таблицы, созданные как InnoDB:
Ключи, которые я хочу связать,
- > users- > userid (первичный)
- > session- > userid (index)
Единственное, что я не понимаю в этом процессе, это то, что различные настройки для "On update" и "On delete" делают
Возможные варианты:
- - (ничего?)
- Каскад (???)
- Установить Null (устанавливает все значение null)
- Никаких действий (хорошо...)
- Ограничить (???)
В основном я хочу, чтобы данные в сеансах удалялись, когда пользователь полностью удаляется
Это, так как сеансы будут удалены только после того, как истечение будет обнаружено моим диспетчером сеансов...
Итак, если кто-нибудь может сказать мне, что эти варианты делают, это будет очень признательно.
Ответы
Ответ 1
CASCADE
будет распространять изменение при изменении родительского элемента. (Если вы удалите строку, строки в ограниченных таблицах, которые ссылаются на эту строку, также будут удалены и т.д.)
SET NULL
устанавливает значение столбца в NULL, когда родительская строка уходит.
RESTRICT
приводит к сбою попытки DELETE родительской строки.
EDIT: вы не спрашивали о них, но стандарт SQL определяет два других действия: SET DEFAULT
и NO ACTION
. В MySQL NO ACTION
эквивалентно RESTRICT
. (В некоторых СУБД NO ACTION
- отсроченная проверка, но в MySQL все проверки выполняются незамедлительно.) Парсер MySQL принимает SET DEFAULT
, но оба механизма InnoDB и NDB отклоняют эти утверждения, поэтому SET DEFAULT
на самом деле не может быть используется для ограничения ON UPDATE
или ON DELETE
.
Также обратите внимание, что каскадные действия внешнего ключа не активируют триггеры в MySQL.
Ответ 2
Таблица, содержащая внешний ключ, называется ссылкой или дочерней таблицей, а таблица, содержащая ключ-кандидат, называется ссылкой или родительская таблица.
Установить NULL. Устанавливает значение столбца NULL при удалении родительской таблицы.
CASCADE. CASCADE будет распространять изменение, когда родительский элемент изменится. Если вы удалите строку, строки в файлах с ограничениями, которые ссылаются на эту строку , также будут удалены и т.д.
RESTRICT: RESTRICT не позволяет удалить заданную родительскую строку, если существует дочерняя строка, которая ссылается на значение для этой родительской строки.
НЕТ ДЕЙСТВИЯ: НЕТ ДЕЙСТВИЙ и RESTRICT очень похожи. когда в ссылочной таблице выполняется инструкция UPDATE или DELETE, СУБД в конце выполнения оператора проверяет, что не связаны никакие ссылки . в короткой дочерней строке не беспокоится, если родительская строка удалить или обновить.