156 votes

SQL ON DELETE CASCADE, Dans quel sens la suppression s'effectue-t-elle ?

Si j'ai deux relations dans une base de données, comme ceci :

CREATE TABLE Courses (
  CourseID int NOT NULL PRIMARY KEY,
  Course VARCHAR(63) NOT NULL UNIQUE,
  Code CHAR(4) NOT NULL UNIQUE
);

CREATE TABLE BookCourses (
  EntryID int NOT NULL PRIMARY KEY,
  BookID int NOT NULL,
  Course CHAR(4) NOT NULL,
  CourseNum CHAR(3) NOT NULL,
  CourseSec CHAR(1) NOT NULL
);

et j'établis une relation de clé étrangère entre les deux, comme ceci :

ALTER TABLE BookCourses
ADD FOREIGN KEY (Course)
REFERENCES Courses(Code)
ON DELETE CASCADE;

Alors vous pouvez voir que le Course dans l'élément BookCourses fait référence à la relation Code dans le Courses relation.

Ma question est la suivante : lorsqu'une suppression se produit dans l'une ou l'autre des deux relations, dans quel sens la suppression se produit-elle en cascade ? Si je supprime un tuple dans la relation Courses supprimera-t-elle tous les tuples référents dans la relation BookCourses ou est-ce l'inverse ?

12 votes

On se demande seulement pourquoi le Categories La table a un CourseID comme clé primaire, tandis que le Courses La table a le EntryID . Vous devez sérieusement repenser vos choix de noms.

8 votes

Veuillez utiliser les noms de colonnes appropriés afin d'éviter toute confusion et de clarifier la structure de la base de données.

187voto

John Woo Points 132738

La cascade fonctionne lorsque vous supprimez quelque chose sur la table. Courses . Tout dossier sur la table BookCourses qui fait référence à la table Courses seront supprimés automatiquement.

Mais lorsque vous essayez de supprimer sur la table BookCourses seule la table elle-même est affectée et non pas sur les Courses

question de suivi : pourquoi avez-vous CourseID sur la table Catégorie ?

Peut-être que tu devrais restructurer ton schéma en ceci,

CREATE TABLE Categories 
(
  Code CHAR(4) NOT NULL PRIMARY KEY,
  CategoryName VARCHAR(63) NOT NULL UNIQUE
);

CREATE TABLE Courses 
(
  CourseID INT NOT NULL PRIMARY KEY,
  BookID INT NOT NULL,
  CatCode CHAR(4) NOT NULL,
  CourseNum CHAR(3) NOT NULL,
  CourseSec CHAR(1) NOT NULL,
);

ALTER TABLE Courses
ADD FOREIGN KEY (CatCode)
REFERENCES Categories(Code)
ON DELETE CASCADE;

61 votes

Cette réponse a des noms de tables et des structures différentes de celles de la question... Ce qui la rend beaucoup moins utile.

5 votes

@DanielBeardsley, je ne suis pas d'accord pour dire que cette réponse n'est pas utile. Si vous lisez ce qu'elle dit. Cependant, je suis d'accord pour dire que la réponse pourrait être formatée de manière à ce que l'on sache clairement ce qui fait partie de la réponse proprement dite et ce qui relève d'une autre discussion. Le schéma mis en évidence ci-dessus est lié à la question de suivi mais pas la réponse à la vraie question.

32voto

Morten Holmgaard Points 713

Voici un exemple simple pour les autres personnes qui visitent ce vieux poste, mais qui sont déroutées par l'exemple dans la question et l'autre réponse :

Livraison -> paquet (un -> plusieurs)

CREATE TABLE Delivery(
    Id INT IDENTITY PRIMARY KEY,
    NoteNumber NVARCHAR(255) NOT NULL
)

CREATE TABLE Package(
    Id INT IDENTITY PRIMARY KEY,
    Status INT NOT NULL DEFAULT 0,
    Delivery_Id INT NOT NULL,
    CONSTRAINT FK_Package_Delivery_Id FOREIGN KEY (Delivery_Id) REFERENCES Delivery (Id) ON DELETE CASCADE
)

L'entrée avec la clé étrangère Delivery_Id (Package) est supprimée avec l'entité référencée dans la relation FK (Delivery).

Ainsi, lorsqu'une livraison est supprimée, les paquets qui y font référence sont également supprimés. Si un paquet est supprimé, rien ne se passe pour les livraisons.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X