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
请使用正确的列名以避免混淆并清除数据库结构。
Gunjan Shah 2013年

Answers:


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
大!谢谢。后续答案:因为我想不通。现在固定...在我的DB
奥利弗Spryn

59
这个答案的表名和结构与问题不同...使其用途大大减少。
丹尼尔·比尔兹利

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
)

外键为Delivery_Id(Package)的条目将与FK关系(Delivery)中的引用实体一起删除。

因此,删除交货后,引用该交货的包裹也将被删除。如果包裹被删除,则任何交付都不会发生。


感谢您简单易懂的示例!
汤姆·斯宾塞
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.