SQL ON DELETE CASCADE, de que maneira a exclusão ocorre?


156

Se eu tiver duas relações em um banco de dados, assim:

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
);

e eu estabeleço um relacionamento de chave estrangeira entre os dois, assim:

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

Então você pode ver que o Courseatributo na BookCoursesrelação faz referência ao Codeatributo na Coursesrelação.

Minha pergunta é quando ocorre uma exclusão em qualquer uma das duas relações. De que maneira a exclusão é em cascata? Se eu excluir uma tupla na Coursesrelação, ela excluirá todas as tuplas de referência na BookCoursesrelação ou será o contrário?


11
Só se pergunta por que a Categoriestabela possui a CourseIDcomo Chave Primária enquanto a Coursestabela possui o EntryID. Você realmente precisa repensar suas opções de nomes.
— ypercubeᵀᴹ

7
Por favor, use nomes de colunas apropriados para evitar confusão e limpar a estrutura do banco de dados.
— Gunjan Shah

Respostas:


185

O Cascade funcionará quando você excluir algo da tabela Courses. Qualquer registro na tabela BookCoursesque tenha referência à tabela Coursesserá excluído automaticamente.

Mas quando você tenta excluir na tabela, BookCoursesapenas a tabela em si é afetada e não noCourses

pergunta de acompanhamento: por que você tem CourseIDna tabela Categoria?

Talvez você deva reestruturar seu esquema para isso,

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
Ótimo! Obrigado. resposta de acompanhamento: Porque eu pensei demais. Corrigido agora ... e no meu banco de dados
— Oliver Spryn 18/11/2012

59
Essa resposta tem nomes e estruturas de tabela diferentes da pergunta ... Tornando-a muito menos útil.
— Daniel Beardsley

4
@DanielBeardsley, eu não concordo que esta resposta não seja útil. Ou seja, se você ler o que diz. No entanto, concordo que a resposta possa ser formatada, para que fique claro o que faz parte da resposta real e o que é outra discussão. O esquema destacado acima está relacionado à pergunta de acompanhamento, mas não à resposta à pergunta real.
— Baldur

26

Aqui está um exemplo simples para outras pessoas que visitam esse post antigo, mas está confuso com o exemplo da pergunta:

Entrega -> Pacote (Um -> Muitos)

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
)

A entrada com a chave estrangeira Delivery_Id (Package) é excluída com a entidade referenciada no relacionamento FK (Delivery).

Portanto, quando uma Entrega é excluída, os Pacotes referenciados também serão excluídos. Se um pacote for excluído, nada acontece com as entregas.


Obrigado pelo exemplo fácil de entender!
— Tom Spencer
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.