[sql] 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;

그러면 관계의 속성 CourseBookCourses관계 의 속성을 참조 함을 알 수 있습니다 .CodeCourses

내 질문은 두 관계 중 하나에서 삭제가 발생하면 삭제는 어떻게 진행됩니까? Courses관계 에서 튜플을 삭제하면 관계의 모든 참조 튜플이 삭제 BookCourses됩니까 아니면 다른 방법입니까?



답변

Cascade는 테이블에서 무언가를 삭제할 때 작동합니다 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 (패키지)가있는 항목은 FK 관계 (배달)에서 참조 된 엔터티와 함께 ​​삭제됩니다.

따라서 배달이 삭제되면 참조하는 패키지도 삭제됩니다. 패키지가 삭제되면 배송에 아무런 영향이 없습니다.


답변