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?
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;
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.