Точное значение внешнего ключа MySQL «на delete restrict» - PullRequest
47 голосов
/ 10 ноября 2011

У меня есть две таблицы 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 , если строка из collections.privacy имеет значение, совпадающее со значением в privacy_level.level ?

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

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

Ответы [ 2 ]

95 голосов
/ 10 ноября 2011

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

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

0 голосов
/ 19 августа 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...