Подтвердить что ты не робот

Точное значение внешнего ключа MySQL для ограничения на удаление

У меня есть две таблицы 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'? Или это запрещено на основе столбцов?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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