SQL ON DELETE CASCADE, In che modo si verifica l'eliminazione?


156

Se ho due relazioni in un database, in questo modo:

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

e stabilisco una relazione di chiave esterna tra i due, in questo modo:

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

Quindi puoi vedere che l' Courseattributo nella BookCoursesrelazione fa riferimento Codeall'attributo nella Coursesrelazione.

La mia domanda è quando si verifica una cancellazione in una delle due relazioni, in che modo si elimina la cancellazione? Se elimino una tupla nella Coursesrelazione, eliminerà tutte le tuple di riferimento nella BookCoursesrelazione o è il contrario?


11
Ci si chiede solo perché la Categoriestabella abbia CourseIDcome chiave primaria mentre la Coursestabella ha EntryID. Devi seriamente ripensare le tue scelte di denominazione.
ypercubeᵀᴹ

7
Si prega di utilizzare i nomi delle colonne corretti per evitare confusione e cancellare la struttura del DB.
Gunjan Shah,

Risposte:


185

Cascade funzionerà quando elimini qualcosa sul tavolo Courses. Qualsiasi record sulla tabella BookCoursesche fa riferimento alla tabella Coursesverrà eliminato automaticamente.

Ma quando si tenta di eliminare sulla tabella BookCoursessolo la tabella stessa è interessata e non suCourses

domanda di follow-up: perché hai CourseIDsul tavolo categoria?

Forse dovresti ristrutturare il tuo schema in questo,

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
Grande! Grazie. risposta di follow-up: Perché ho pensato troppo. Risolto ora ... e nel mio DB
Oliver Spryn il

59
Questa risposta ha nomi e strutture di tabelle diversi rispetto alla domanda ... Rendendola molto meno utile.
Daniel Beardsley,

4
@DanielBeardsley, non sono d'accordo sul fatto che questa risposta non sia utile. Cioè se leggi cosa dice. Concordo, tuttavia, che la risposta potrebbe essere formattata, quindi è chiaro cosa fa parte della risposta effettiva e qual è un'altra discussione. Lo schema sopra evidenziato è correlato alla domanda di follow-up ma non alla risposta alla domanda effettiva.
Baldur,

26

Ecco un semplice esempio per altri che vedono questo vecchio post, ma sono confusi dall'esempio nella domanda:

Consegna -> Pacco (Uno -> Molti)

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
)

La voce con la chiave esterna Delivery_Id (Pacchetto) viene eliminata con l'entità referenziata nella relazione FK (Consegna).

Pertanto, quando una consegna viene eliminata, anche i pacchetti che fanno riferimento verranno eliminati. Se un pacchetto viene eliminato, non succede nulla a nessuna consegna.


Grazie per l'esempio facile da capire!
Tom Spencer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.