SQL TRÊN CASCADE XÓA, cách nào xảy ra việc xóa?


156

Nếu tôi có hai quan hệ trong cơ sở dữ liệu, như thế này:

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

và tôi thiết lập mối quan hệ khóa ngoại giữa hai người, như thế này:

ALTER TABLE BookCourses
ADD FOREIGN KEY (Course)
REFERENCES Courses(Code)
ON DELETE CASCADE;

Sau đó, bạn có thể thấy rằng Coursethuộc tính trong BookCoursesquan hệ tham chiếu Codethuộc tính trong Coursesquan hệ.

Câu hỏi của tôi là khi việc xóa xảy ra ở một trong hai mối quan hệ, việc xóa tầng đó theo cách nào? Nếu tôi xóa một tuple trong Coursesmối quan hệ, nó sẽ xóa tất cả các tuple tham chiếu trong BookCoursesmối quan hệ, hay nó là cách khác?


11
Người ta chỉ tự hỏi tại sao Categoriesbảng có một CourseIDKhóa chính trong khi Coursesbảng có EntryID. Bạn thực sự cần phải suy nghĩ lại về lựa chọn đặt tên của bạn.
ypercubeᵀᴹ

7
Vui lòng sử dụng tên cột thích hợp để tránh nhầm lẫn và xóa cấu trúc DB.
Gunjan Shah

Câu trả lời:


185

Cascade sẽ hoạt động khi bạn xóa một cái gì đó trên bàn Courses. Mọi bản ghi trên bảng BookCoursescó tham chiếu đến bảng Coursessẽ bị xóa tự động.

Nhưng khi bạn cố xóa trên bàn thì BookCourseschỉ có bảng bị ảnh hưởng chứ không phải trênCourses

câu hỏi tiếp theo: tại sao bạn có CourseIDtrên bảng Danh mục?

Có lẽ bạn nên cấu trúc lại lược đồ của bạn vào đây,

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
Tuyệt quá! Cảm ơn bạn. Theo dõi câu trả lời: Bởi vì tôi nghĩ quá. Đã sửa ngay bây giờ ... và trong DB của tôi
Oliver Spryn

59
Câu trả lời này có tên bảng và cấu trúc khác với câu hỏi ... Làm cho nó ít hữu ích hơn.
Daniel Beardsley

4
@DanielBeardsley, tôi không đồng ý rằng câu trả lời này không hữu ích. Đó là nếu bạn đọc những gì nó nói. Tuy nhiên, tôi đồng ý rằng câu trả lời có thể được định dạng để nó rõ ràng đâu là một phần của câu trả lời thực sự và đâu là cuộc thảo luận khác. Lược đồ được tô sáng ở trên có liên quan đến câu hỏi tiếp theo nhưng không phải là câu trả lời cho câu hỏi thực tế.
Hói

26

Đây là một ví dụ đơn giản cho những người khác xem bài cũ này, nhưng bị nhầm lẫn bởi ví dụ trong câu hỏi:

Giao hàng -> Gói hàng (Một -> Nhiều)

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
)

Mục nhập có khóa ngoại Delivery_Id (Gói) bị xóa với thực thể được tham chiếu trong mối quan hệ FK (Giao hàng).

Vì vậy, khi một Giao hàng bị xóa, các Gói tham chiếu cũng sẽ bị xóa. Nếu một Gói bị xóa, không có gì xảy ra với bất kỳ giao hàng nào.


Cảm ơn bạn cho ví dụ dễ hiểu!
Tom Spencer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.