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_level
si 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.
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.
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.