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

时间:2012-11-18 21:36:01

标签: 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
);

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

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

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

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

2 个答案:

答案 0 :(得分:174)

当您删除表Courses上的内容时,Cascade会起作用。表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;

答案 1 :(得分:10)

这是其他人访问此旧帖子的简单示例,但与问题中的示例相混淆:

交付->包裹(一个->许多)

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(包裹)的条目将与FK关系(传递)中的引用实体一起删除。

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