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