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

поэтому, когда доставка удалена, пакеты, ссылающиеся на нее, также будут удалены. Если пакет удален, с ним ничего не происходит поставки.