2012-11-18 13 views
122

Se ho due relazioni in un database, come questo:SQL ON DELETE CASCADE, In quale modo si verifica la cancellazione?

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 stabilisce una relazione di chiave esterna tra i due, in questo modo:

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

allora si può vedere che l'attributo Course nella relazione BookCourses fa riferimento all'attributo Code nella relazione Courses.

La mia domanda è quando si verifica una cancellazione in una delle due relazioni, in che modo viene eliminata la cascata? Se elimino una tupla nella relazione Courses, eliminerà tutte le tuple di riferimento nella relazione BookCourses oppure è il contrario?

Grazie per il vostro tempo.

+7

Ci si chiede il motivo per cui solo la tabella 'Categories' ha un' CourseID' come chiave primaria, mentre la tabella 'Courses' ha la' EntryID'. Hai seriamente bisogno di ripensare alle tue scelte di denominazione. –

+4

Si prega di utilizzare i nomi delle colonne corretti per evitare confusione e cancellare la struttura del DB. –

risposta

152

Cascade funzionerà quando si elimina qualcosa sulla tabella Courses. Verranno inoltre cancellati tutti i record sulla tabella BookCourses che fa riferimento alla tabella Courses.

Ma quando si tenta di eliminare il tavolo BookCourses solo la tabella stessa è influenzato e non sul Courses

follow-up domanda: perché hai CourseID sul tavolo Categoria?

Forse si dovrebbe ristrutturare lo 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

Ottimo! Grazie. * risposta di follow-up: perché ho pensato troppo. Risolto adesso ... e nel mio DB * –

+51

Questa risposta ha diversi nomi di tabelle e strutture rispetto alla domanda ... Rendendola molto meno utile. –

+0

Non funziona ... – user3177068

Problemi correlati