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