web-dev-qa-db-fra.com

Signification exacte de la clé étrangère de MySQL 'lors de la suppression de la restriction'

J'ai deux tables MySQL: collections et privacy_level.
Je les définis avec une relation clé étrangère comme telle:

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;  

Ma question concerne le ON DELETE RESTRICT clause et je n'ai pas pu obtenir la réponse du manuel en ligne ou d'une recherche google.

Est-ce à dire que je peux jamais supprimer une ligne de privacy_level?
Ou cela signifie-t-il que je ne peux pas supprimer une ligne de privacy_levelsi une ligne de collections.privacy a une valeur identique à celle de privacy_level.level?

Autrement dit, si privacy_level a level = 2, name = 'top secret' mais aucune entrée dans les collections. La confidentialité a privacy = 2, puis-je supprimer le level = 2, name = 'top secret' entrée? Ou est-il interdit à l'échelle de la colonne?

Merci pour tout aperçu.

47
Donkey Trouble

ON DELETE RESTRICT signifie que vous ne pouvez pas supprimer une ligne parent si une ligne enfant existe qui fait référence à la valeur de cette ligne parent. Si la ligne parent n'a pas de lignes enfant référençantes, vous pouvez supprimer cette ligne parent.

ON DELETE RESTRICT est à peu près une syntaxe superflue , car c'est de toute façon le comportement par défaut d'une clé étrangère.

97
Bill Karwin

Vous pouvez également utiliser ON DELETE CASCADE, cela signifie que lorsque vous supprimez le parent, tous les enfants seront supprimés automatiquement, cela est utile lorsque vous avez une table associée à une autre contenant certains paramètres ou réglages.