Точное значение внешнего ключа MySQL в предложении delete restrict

У меня есть две таблицы MySQL: collections и privacy_level.
Я определяю их с помощью отношения внешнего ключа как такового:

CREATE TABLE collections (
  coll_id smallint NOT NULL AUTO_INCREMENT UNSIGNED,
  name varchar(30) NOT NULL,
  privacy tinyint NOT NULL UNSIGNED DEFAULT '0',
  PRIMARY KEY(coll_id),
  INDEX(privacy),
  FOREIGN KEY fk_priv (privacy) REFERENCES privacy_level (level) ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB;  

 CREATE TABLE privacy_level (
   level tinyint NOT NULL UNSIGNED,
   name varchar(20) NOT NULL,
   PRIMARY KEY (level)
 ) ENGINE InnoDB;  

Мой вопрос касается предложения ON DELETE RESTRICT, и я не смог получить ответ из онлайн-руководства или поиска в Google.

Означает ли это, что я никогда не могу удалить строку из privacy_level?
Или это означает, что я не могу удалить строку из privacy_level if < / strong> строка из collections.privacy имеет значение, такое же, как значение в privacy_level.level?

То есть, если privacy_level имеет level = 2, name = 'top secret', но нет записи в коллекциях. Конфиденциальность имеет privacy = 2, могу ли я удалить запись level = 2, name = 'top secret'? Или это запрещено на всей колонке?

Спасибо за понимание.


person Donkey Trouble    schedule 09.11.2011    source источник


Ответы (2)


ON DELETE RESTRICT означает, что вы не можете удалить данную родительскую строку, если существует дочерняя строка, которая ссылается на значение этой родительской строки. Если в родительской строке нет ссылок на дочерние строки, вы можете удалить эту родительскую строку.

ON DELETE RESTRICT - это в значительной степени лишний синтаксис, потому что в любом случае это поведение по умолчанию для внешнего ключа.

person Bill Karwin    schedule 09.11.2011
comment
Вы имеете в виду, что ON DELETE RESTRICT то же самое, что и ON DELETE NO ACTION? - person Shafizadeh; 06.09.2016
comment
@Shafizadeh, прочтите вертабело. ru / blog / Technical-article / - person Bill Karwin; 06.09.2016
comment
@Bill, в этой статье говорится, что NO ACTION - это то же самое, что RESTRICT в MySQL, и отсылает обратно к SO в подтверждение своего заявления ... - person Code4R7; 23.05.2017
comment
@ Code4R7 ср. Указание RESTRICT (или NO ACTION) аналогично отсутствию предложения ON DELETE или ON UPDATE. dev.mysql.com/doc/refman/ 5.7 / ru / create-table-foreign-keys.html - person Bill Karwin; 23.05.2017

Также вы можете использовать ON DELETE CASCADE, это означает, что при удалении родителя все дочерние элементы будут удалены автоматически, это полезно, когда у вас есть таблица, связанная с другой, которая содержит некоторые параметры или настройки.

person jose miguel rivera rodríguez    schedule 19.08.2016
comment
какая из них является родительской, а какая дочерней? Один ссылается на ребенка или наоборот? - person Sebastián Grignoli; 26.09.2019
comment
Если у вас есть две таблицы, users и user_settings, таблица пользователей является родительской, а таблица пользовательских настроек - дочерней. Таким образом, когда вы удаляете пользователя, автоматически удаляются настройки, относящиеся к удаленному пользователю. - person jose miguel rivera rodríguez; 21.07.2020