SQL ON DELETE CASCADE,删除的方式是什么?

Oli*_*ryn 152 sql database database-design cascade relation

如果我在数据库中有两个关系,如下所示:

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
);
Run Code Online (Sandbox Code Playgroud)

我建立了两者之间的外键关系,如下所示:

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

然后,你可以看到,Course在属性BookCourses关系引用Code属性的Courses关系.

我的问题是当两个关系中的任何一个发生删除时,删除级联的方式是什么?如果我删除Courses关系中的元组,它会删除关系中的所有引用元组BookCourses,还是反过来?

感谢您的时间.

Joh*_*Woo 181

当您删除桌面上的内容时,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;
Run Code Online (Sandbox Code Playgroud)

  • 这个答案有不同的表名和结构而不是问题......使它变得不那么有用了. (59认同)
  • 大!谢谢.*跟进回答:因为我过度思考它.现在修复...在我的DB* (5认同)
  • @DanielBeardsley,我不同意这个答案没用.那就是你读了它的内容.我确实同意答案可以格式化,因此很清楚实际答案的一部分是什么,另一个讨论是什么.上面突出显示的架构与_follow-up question_有关,但与实际问题的答案无关. (4认同)

Mor*_*ard 18

这是一个简单的例子,其他人参与这个旧帖子,但对问题中的例子感到困惑:

交货 - >包裹(一个 - >多个)

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
)
Run Code Online (Sandbox Code Playgroud)

使用FK关系(Delivery)中引用的实体删除具有外键Delivery_Id(Package)的条目.

因此,当删除交付时,引用它的包也将被删除.如果删除包,则任何交付都不会发生任何变化.