Wenn ich zwei Relationen in einer Datenbank habe, so:
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
);
und ich stelle eine Fremdschlüsselbeziehung zwischen den beiden her, wie folgt:
ALTER TABLE BookCourses
ADD FOREIGN KEY (Course)
REFERENCES Courses(Code)
ON DELETE CASCADE;
Dann können Sie sehen, dass das Attribut Course
in der Beziehung BookCourses
auf das Attribut Code
in der Beziehung Courses
verweist.
Meine Frage ist, wann eine Löschung in einer der zwei Relationen auftritt, auf welche Weise die Löschungskaskade? Wenn ich ein Tupel in der Beziehung Courses
lösche, werden dann alle referenzierenden Tupel in der Beziehung BookCourses
gelöscht, oder ist es umgekehrt?
Cascade funktioniert, wenn Sie etwas in Tabelle Courses
löschen. Jeder Datensatz in Tabelle BookCourses
, der auf Tabelle Courses
verweist, wird automatisch gelöscht.
Wenn Sie jedoch versuchen, in der Tabelle BookCourses
nur die Tabelle selbst zu löschen, ist dies nicht in der Tabelle Courses
der Fall.
Anschlussfrage: Warum haben Sie CourseID
in der Tabellenkategorie?
Vielleicht sollten Sie Ihr Schema in diese umstrukturieren,
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;
Hier ist ein einfaches Beispiel für andere, die diesen alten Beitrag besuchen, das jedoch durch das Beispiel in der Frage verwirrt ist:
Lieferung -> Paket (Eins -> Viele)
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
)
Der Eintrag mit dem Fremdschlüssel Delivery_Id (Package) wird mit der referenzierten Entität in der FK-Beziehung (Delivery) gelöscht.
Wenn also eine Lieferung gelöscht wird, werden auch die Pakete gelöscht, auf die sie verweist. Wenn ein Paket gelöscht wird, passiert nichts mit Lieferungen.