it-swarm.com.de

SQL ON DELETE CASCADE, wie erfolgt die Löschung?

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?

147
Oliver Spryn

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;
178
John Woo

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.

13