2012-11-18 11 views
122

Jeśli mam dwie relacje w bazie danych, na przykład:SQL ON DELETE CASCADE, w jaki sposób występuje usunięcie?

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

i ustanowienia relacji klucza obcego między nimi, tak:

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

Następnie można zobaczyć, że atrybut Course w relacji BookCourses odwołuje się do atrybutu Code w relacji .

Moje pytanie brzmi, kiedy usunięcie występuje w jednym z dwóch relacji, w jaki sposób kaskada usuwania? Jeśli usunę krotkę z relacji Courses, czy usunie ona wszystkie krotki odnośników w relacji BookCourses, czy jest odwrotnie?

Dziękuję za poświęcony czas.

+7

Ciekawe tylko dlaczego 'stół Categories' ma' CourseID' jako klucz podstawowy, podczas gdy 'stół Courses' ma' EntryID'. Musisz poważnie przemyśleć swoje wybory dotyczące nazewnictwa. –

+4

Proszę podać prawidłowe nazwy użytkowników, aby uniknąć pomyłek i wyraźnej struktury DB. –

Odpowiedz

152

Kaskada będzie działać po usunięciu czegoś z tabeli Courses. Wszelkie wpisy w tabeli BookCourses, które odwołują się do tabeli Courses, również zostaną usunięte.

Ale podczas próby usunięcia na stole BookCourses tylko sama tabela ma wpływu, a nie na Courses

obserwacji pytanie: dlaczego masz CourseID na tabeli kategorii?

Może należy zrestrukturyzować swój schemat do tego

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

Świetnie! Dziękuję Ci. * Odpowiedź uzupełniająca: Ponieważ przeszedłem przez to. Naprawiono teraz ... i w mojej DB * –

+51

Ta odpowiedź ma różne nazwy i struktury tabel niż pytanie ... O wiele mniej użyteczne. –

+0

Nie działa ... – user3177068

Powiązane problemy