SQL ON DELETE CASCADE, каким образом происходит удаление?
если у меня есть два отношения в базе данных, как это:
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
);
и я устанавливаю связь внешнего ключа между ними, например:
ALTER TABLE BookCourses
ADD FOREIGN KEY (Course)
REFERENCES Courses(Code)
ON DELETE CASCADE;
тогда вы можете видеть, что на BookCourses
отношении ссылок на Courses
отношения.
мой вопрос заключается в том, когда удаление происходит в любом из двух отношений, каким образом происходит каскад удаления? Если я удалю Кортеж в Courses
отношение, будет ли это удалите все ссылочные кортежи в BookCourses
отношение, или это наоборот?
Спасибо за ваше время.
2 ответа:
каскад будет работать, когда вы удалите что-то на таблице
Courses
. Любая запись на столеBookCourses
который имеет ссылку на таблицуCourses
также будет удален.но когда вы пытаетесь удалить на таблице
BookCourses
только сама таблица влияет, а не наCourses
следующий вопрос: почему у вас
CourseID
в таблице категорий?может быть, вы должны перестроить свою схему в это,
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;
вот простой пример для других visting этот старый пост, но смущает пример в вопросе:
Доставка -> Пакет (Один -> Много)
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 )
запись с внешним ключом Delivery_Id (Package) удаляется вместе со ссылочной сущностью в связи FK (Delivery).
поэтому, когда доставка удаляется, пакеты, ссылающиеся на нее, также будут удалены. Если пакет удален ничего не происходит с любым поставки.