SQL sur DELETE CASCADE, de quelle manière la suppression se produit-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'établit 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 dans la relation BookCourses fait référence à l'attribut Code dans la relation Courses.

Ma question est quand une suppression se produit dans l'une des deux relations, de quelle manière la suppression cascade-t-elle? Si je supprime un tuple dans la relation Courses, supprimera-t-il tous les tuples de référence dans le BookCourses relation, ou est-ce l'inverse?

Merci pour votre temps.

133
demandé sur Joe Shaw 2012-11-19 01:36:00

2 réponses

Cascade fonctionnera lorsque vous supprimez quelque chose sur la table Courses. Tout enregistrement sur la table {[2] } qui fait référence à la table Courses sera également 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 de suivi: pourquoi avez-vous CourseID sur la table de la Catégorie?

Peut-être que vous devriez restructurer votre 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;
166
répondu John Woo 2016-08-24 17:44:11

Voici un exemple simple pour d'autres qui visitent cet ancien post, mais est confus par l'exemple dans la question:

Livraison - > Paquet (Un -> Beaucoup)

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 référencés seront également supprimés. Si un colis est supprimé, il n'arrive rien aux livraisons.

1
répondu Morten Holmgaard 2018-08-22 11:52:00