2013-04-23 2 views
18

Параметры внешнего ключа при обновлении и удалении. Что делает каждое поле [Ограничить, Каскад, Установить нуль, никаких действий]?Параметры внешнего ключа Mysql для внешнего ключа [Ограничить, Каскад, Установить нуль, никаких действий], что они делают?

+2

Если все остальное терпит неудачу, прочитайте руководство: http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html –

ответ

31

Если вы один на один:

Для обоих обновления и удаления:

если вы пытаетесь обновить/удалить родительскую строку:

Ограничить: Ничто буду не будет удалять, если есть ребенок ряд

Каскад: ребенок строка будет удалять/обновление слишком

Set Null: дочерний столбец будет установлен в нулевое значение, если вы удалите родительский

Нет действий: ребенок строка не будет заботой удаления/обновления

+1

«Ограничить» и «никаких действий» одинаковы. Ограничение - это только ключевое слово mysql, а «no action» - это стандарт SQL. – ProfileTwist

+0

@ProfileTwist Нет, я понимаю, что «ограничение» отменяет операцию обновления/удаления, если есть записи (сначала вы должны удалить дочерние строки), напротив «no action» позволит вам обновить/удалить запись, даже если являются дочерними строками – glautrou

+1

@glautro Проверьте http://stackoverflow.com/questions/5809954/mysql-restrict-and-no-action. Возможно, некоторые двигатели работают так, как вы описываете, но в Innodb невозможно обновить/удалить родительскую строку и создать дочерние строки-сирота, если проверка внешнего ключа временно отключена. Это потрясающе для целостности данных (если это то, чего вы пытаетесь достичь с помощью FK) – ProfileTwist

18

таблицы, содержащей Внешний ключ называется ссылки или дочерней таблицы, и таблица, содержащая ключ кандидата называется ссылки или родительской таблицы.

Set NULL: Устанавливает значение столбца NULL при удалении строки родительской таблицы.

КАСКАД: CASCADE будет распространить изменения когда родитель изменения. При удалении строки, строки в стесненных таблицах, которые ссылаются на эту строку также будет удалено и т.д.

RESTRICT: RESTRICT причины вы не можете удалить данную родительской строки если ребенок ряд существует который ссылается на значение для этой родительской строки.

NO ACTION: NO ACTION и RESTRICT очень похожи друг на друга. когда в ссылочной таблице выполняется оператор UPDATE или DELETE, СУБД в конце выполнения оператора проверяет, что ни одна из ссылочных связей не является нарушена. в короткой дочерней строке нет проблем, если родительская строка удалить или обновление.

+1

Перефразирование 'в короткой дочерней строке не касается, если родительская строка удаляет или обновляет', означает ли это, что в NO ACTION, если родитель удален , это не разрешено? В случае родительского обновления ребенок остается прежним? – Pathros

+0

@pathros no dear, это означает, что никаких изменений не произойдет в дочерней таблице, будет выполняться только родительская таблица - либо это удаление, либо обновление - это означает, что только родитель будет удален (в случае удаления), и все дочерние элементы будут сохранены, поскольку они будет – ImranNaqvi

+1

, и я знаю, что это заставляет нас спросить, почему это похоже «Ограничить», все еще ищет ответ - если кто-то получил логику, любезно разделите – ImranNaqvi

Смежные вопросы