web-dev-qa-db-fra.com

SQL ON DELETE CASCADE, de quelle manière se produit la suppression?

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;

Ensuite, vous pouvez voir que l'attribut Course de la relation BookCourses fait référence à l'attribut Code de la relation Courses.

Ma question est la suivante: lorsqu'une suppression survient dans l'une ou l'autre des deux relations, de quelle manière la suppression est-elle mise en cascade? Si je supprime un tuple dans la relation Courses, supprimera-t-il tous les nuplets de référence dans la relation BookCourses, ou est-ce l'inverse?

147
Oliver Spryn

Cascade fonctionnera lorsque vous supprimerez quelque chose sur la table Courses. Tout enregistrement de la table BookCourses ayant une référence à la table Courses sera automatiquement supprimé.

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

question suivante: pourquoi avez-vous CourseID sur la catégorie du tableau?

Peut-être devriez-vous restructurer votre schéma en cela,

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;
178
John Woo

Voici un exemple simple pour les autres lecteurs de cet ancien message, mais il est confus par l'exemple de la question:

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 packages faisant référence à celle-ci seront également supprimés. Si un colis est supprimé, il ne se produit aucune livraison.

13
Morten Holmgaard