2012-11-18 5 views
122

Wenn ich zwei Beziehungen in einer Datenbank, wie folgt aus:SQL ON DELETE CASCADE, wie erfolgt die Löschung?

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 schaffen eine Fremdschlüsselbeziehung zwischen den beiden, wie folgt aus:

ALTER TABLE BookCourses 
ADD FOREIGN KEY (Course) 
REFERENCES Courses(Code) 
ON DELETE CASCADE; 

Dann können Sie sehen, dass das Course Attribut in der BookCourses Beziehung verweist das Code Attribut in der Courses Beziehung.

Meine Frage ist, wenn eine Löschung in einer der beiden Beziehungen auftritt, welche Art kaskadiert die Löschung? Wenn ich ein Tupel in der Courses-Beziehung lösche, löscht es dann alle referenzierenden Tupel in der BookCourses-Beziehung oder ist es umgekehrt?

Vielen Dank für Ihre Zeit.

+7

Man braucht sich nur die Frage, warum die 'Categories' Tabelle einen' CourseID' als Primärschlüssel hat, während die 'Courses' Tabelle, die die' EntryID' hat. Sie müssen Ihre Namensauswahl ernsthaft überdenken. –

+4

Bitte verwenden Sie die richtigen Spaltennamen, um Verwechslungen zu vermeiden und die DB-Struktur zu löschen. –

Antwort

152

Cascade funktioniert, wenn Sie etwas in Tabelle Courses löschen. Jeder Datensatz in der Tabelle BookCourses, der sich auf die Tabelle Courses bezieht, wird ebenfalls gelöscht.

Aber wenn Sie versuchen, auf dem Tisch löschen BookCourses nur die Tabelle selbst betroffen ist und nicht auf der Courses

Follow-up-Frage: Warum haben Sie CourseID auf dem Tisch Kategorie?

Vielleicht sollten Sie Ihr Schema in dieser Umstrukturierung,

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; 
+5

Großartig! Vielen Dank. * Follow-up Antwort: Weil ich es über dachte. Jetzt behoben ... und in meinem DB * –

+51

Diese Antwort hat andere Tabellennamen und Strukturen als die Frage ... Making es weit weniger nützlich. –

+0

funktioniert nicht ... – user3177068

Verwandte Themen