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的属性。BookCoursesCodeCourses

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

4

2 回答 2

187

当您删除 table 上的某些内容时,Cascade 将起作用Courses。表上任何BookCourses引用表的记录Courses都将被自动删除。

但是当您尝试在表上删除时,BookCourses只有表本身会受到影响,而不是在Courses

追问:为什么CourseID表中有Category?

也许你应该把你的模式重组成这个,

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;
于 2012-11-18T21:38:38.270 回答
31

这是其他访问此旧帖子的其他人的一个简单示例,但对问题中的示例和其他答案感到困惑:

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

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) 中的引用实体一起删除。

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

于 2018-08-22T11:52:00.730 回答