删除级联,删除以哪种方式发生?

如果我在数据库中有两个关系,像这样:

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;

然后,您可以看到 BookCourses关系中的 Course属性引用 Courses关系中的 Code属性。

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

186579 次浏览

删除表 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;

这里有一个简单的例子,让其他人访问这个旧帖子,但是被问题中的例子和另一个答案搞糊涂了:

送货-> 包裹(一件-> 多件)

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
)

使用 FK 关系中的引用实体删除带有外键 DeliverId (Package)的条目。

因此,当一个传递被删除时,引用它的包也将被删除。如果包裹被删除,任何交付都不会发生。