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;

จากนั้นคุณจะเห็นว่าCourseแอตทริบิวต์ในBookCoursesความสัมพันธ์อ้างอิงCodeคุณลักษณะในCoursesความสัมพันธ์

คำถามของฉันคือเมื่อการลบเกิดขึ้นในความสัมพันธ์แบบใดแบบหนึ่งจากสองแบบใดการลบแบบนี้จะทำอย่างไร หากฉันลบสิ่งอันดับในCoursesความสัมพันธ์มันจะลบสิ่งอันดับอ้างอิงทั้งหมดในBookCoursesความสัมพันธ์หรือเป็นวิธีอื่น ๆ


11
เพียงหนึ่งเดียวที่สงสัยว่าทำไมCategoriesตารางมีCourseIDเป็นคีย์หลักในขณะที่ตารางมีCourses EntryIDคุณต้องคิดใหม่เกี่ยวกับตัวเลือกการตั้งชื่อของคุณอย่างจริงจัง
ypercubeᵀᴹ

7
โปรดใช้ชื่อคอลัมน์ที่เหมาะสมเพื่อหลีกเลี่ยงความสับสนและล้างโครงสร้าง DB
Gunjan Shah

คำตอบ:


185

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
ที่ดี! ขอบคุณ. ติดตามคำตอบ: เพราะฉันคิดว่ามันมากกว่า แก้ไขตอนนี้ ... และในฐานข้อมูลของฉัน
Oliver Spryn

59
คำตอบนี้มีชื่อตารางและโครงสร้างที่แตกต่างจากคำถาม ... ทำให้มีประโยชน์น้อยกว่ามาก
Daniel Beardsley

4
@DanielBeardsley ฉันไม่เห็นด้วยว่าคำตอบนี้ไม่มีประโยชน์ นั่นคือถ้าคุณอ่านสิ่งที่พูด อย่างไรก็ตามฉันยอมรับว่าคำตอบนั้นสามารถจัดรูปแบบได้ดังนั้นจึงเป็นที่ชัดเจนว่าส่วนใดของคำตอบที่แท้จริงและการอภิปรายอื่นคืออะไร สคีมาที่เน้นด้านบนนั้นเกี่ยวข้องกับคำถามติดตามผลแต่ไม่ใช่คำตอบของคำถามจริง
Baldur

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
)

รายการที่มี foreign key Delivery_Id (Package) จะถูกลบด้วยเอนทิตีที่อ้างอิงในความสัมพันธ์ FK (การส่งมอบ)

ดังนั้นเมื่อการจัดส่งถูกลบแพ็คเกจที่อ้างอิงจะถูกลบด้วย หากแพ็คเกจถูกลบไม่มีอะไรเกิดขึ้นกับการจัดส่งใด ๆ


ขอบคุณสำหรับตัวอย่างที่เข้าใจง่าย!
Tom Spencer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.