Jeśli mam dwie relacje w bazie danych, na przykład:
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 ustalam relację klucza obcego między nimi, na przykład:
ALTER TABLE BookCourses
ADD FOREIGN KEY (Course)
REFERENCES Courses(Code)
ON DELETE CASCADE;
Wtedy możesz zobaczyć, że Course
atrybut w BookCourses
relacji odwołuje się do Code
atrybutu w Courses
relacji.
Moje pytanie brzmi: kiedy następuje usunięcie w którejkolwiek z dwóch relacji, w jaki sposób przebiega kaskada usuwania? Jeśli usunę krotkę w Courses
relacji, czy spowoduje to usunięcie wszystkich odwołujących się krotek w BookCourses
relacji, czy też jest odwrotnie?
Categories
tabela maCourseID
jako klucz podstawowy, podczas gdyCourses
stół maEntryID
. Musisz poważnie przemyśleć swoje wybory dotyczące nazewnictwa.Odpowiedzi:
Kaskada zadziała, gdy usuniesz coś ze stołu
Courses
. Każdy rekord w tabeli,BookCourses
który ma odniesienie do tabeli,Courses
zostanie automatycznie usunięty.Ale kiedy próbujesz usunąć z tabeli, dotyczy to
BookCourses
tylko samej tabeli, a nieCourses
pytanie uzupełniające: dlaczego masz
CourseID
kategorię tabeli?Może powinieneś zmienić swój schemat w ten sposób,
źródło
Oto prosty przykład dla innych odwiedzających ten stary post, ale jest zdezorientowany przykładem w pytaniu:
Dostawa -> Pakiet (jeden -> wiele)
Wpis z kluczem obcym Delivery_Id (pakiet) jest usuwany z przywoływaną jednostką w relacji FK (dostawa).
W związku z tym, gdy przesyłka zostanie usunięta, związane z nią paczki również zostaną usunięte. Jeśli paczka zostanie usunięta, nic się nie stanie z żadną dostawą.
źródło