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;
Затем вы можете видеть, что атрибут Course
в отношении BookCourses
ссылается на атрибут Code
в отношении Courses
.
Мой вопрос: когда удаление происходит в одном из двух отношений, каким образом происходит каскад удаления? Если я удалю кортеж в отношении " Courses
, удалит ли он все ссылочные кортежи в отношении " BookCourses
, или наоборот?
Ответы
Ответ 1
Каскад будет работать, когда вы удаляете что-то из таблицы Courses
. Любая запись в таблице BookCourses
которая имеет ссылку на таблицу Courses
будет автоматически удалена.
Но когда вы пытаетесь удалить из таблицы BookCourses
только на саму таблицу, а не на Courses
дополнительный вопрос: почему у вас есть CourseID
в таблице Category?
Может быть, вы должны реструктурировать свою схему в этом,
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;
Ответ 2
Вот простой пример для других, посещающих этот старый пост, но он смущен примером в вопросе:
Доставка → Пакет (Один → Много)
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).
Таким образом, при удалении доставки пакеты, ссылающиеся на него, также будут удалены. Если пакет удален, с доставкой ничего не происходит.