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;
вот простой пример для других, которые используют этот старый пост, но смущены примером в вопросе:
Доставка -> Пакет (Один -> Много)
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).
поэтому, когда доставка удалена, пакеты, ссылающиеся на нее, также будут удалены. Если пакет удален, с ним ничего не происходит поставки.