SQL ON DELETE CASCADE, 삭제는 어떤 방식으로 발생합니까?


156

데이터베이스에 다음과 같은 두 가지 관계가있는 경우 :

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됩니까 아니면 다른 방법입니까?


11
Categories테이블이 CourseID기본 키로 왜 테이블을 갖는지 궁금 Courses합니다 EntryID. 네이밍 선택을 진지하게 재고해야합니다.
ypercubeᵀᴹ

7
혼동을 피하고 DB 구조를 명확하게하려면 적절한 열 이름을 사용하십시오.
Gunjan Shah

답변:


185

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;

5
큰! 감사합니다. 후속 답변 : 내가 생각하기 때문에. 지금 수정되었습니다 ... 내 DB
Oliver Spryn

59
이 답변은 질문과 다른 테이블 이름과 구조를 가지고 있습니다.
Daniel Beardsley

4
@DanielBeardsley, 나는이 대답이 유용하지 않다는 것에 동의하지 않습니다. 그것은 당신이 말하는 것을 읽는다면입니다. 그러나 답변의 형식을 지정할 수 있으므로 실제 답변의 일부와 다른 토론이 무엇인지 분명합니다. 위에서 강조 표시된 스키마는 후속 질문 과 관련이 있지만 실제 질문에 대한 답변은 아닙니다.
발더

26

다음은이 오래된 게시물을 방문하는 다른 사람들을위한 간단한 예이지만 질문의 예와 혼동됩니다.

납품-> 패키지 (하나-> 다수)

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 관계 (배달)에서 참조 된 엔터티와 함께 ​​삭제됩니다.

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


이해하기 쉬운 예 감사합니다!
톰 스펜서
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.