SQL ON DELETE CASCADE, ¿De Qué Manera Se Produce la Eliminación?


Si tengo dos relaciones en una base de datos, así:

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

Y establezco una relación de clave foránea entre los dos, así:

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

Entonces puedes ver que el atributo Course en la relación BookCourses hace referencia al atributo Code en la relación Courses.

Mi pregunta es cuando se produce una eliminación en cualquiera de las dos relaciones, ¿de qué manera se produce la eliminación en cascada? Si elimino una tupla en la relación Courses, eliminará todas las tuplas de referencia en la relación BookCourses relación, o es al revés?

Gracias por su tiempo.

Author: Joe Shaw, 2012-11-19

2 answers

La cascada funcionará cuando elimine algo en la tabla Courses. También se suprimirá todo registro del cuadro BookCourses que haga referencia al cuadro Courses.

Pero cuando intenta eliminar en la tabla BookCourses solo la tabla en sí se ve afectada y no en el Courses

pregunta de seguimiento: ¿por qué tiene CourseID en la categoría de la tabla?

Tal vez deberías reestructurar tu esquema en esto,

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;
 166
Author: John Woo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-24 17:44:11

Aquí hay un ejemplo simple para otros que visitan este viejo post, pero está confundido por el ejemplo en la pregunta:

Entrega - > Paquete (Uno -> Muchos)

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
)

La entrada con la clave foránea Delivery_Id (Paquete) se elimina con la entidad referenciada en la relación FK (Entrega).

Así que cuando se borra una Entrega, también se borrarán los Paquetes que hacen referencia a ella. Si se elimina un Paquete, no le pasará nada a ninguna entrega.

 1
Author: Morten Holmgaard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-22 11:52:00