Подтвердить что ты не робот

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, или наоборот?

4b9b3361

Ответ 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).

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