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 externa entre los dos, así:
ALTER TABLE BookCourses
ADD FOREIGN KEY (Course)
REFERENCES Courses(Code)
ON DELETE CASCADE;
Entonces puede ver que el Course
atributo en la BookCourses
relación hace referencia al Code
atributo en la Courses
relación.
Mi pregunta es cuando se produce una eliminación en cualquiera de las dos relaciones, ¿de qué manera la eliminación en cascada? Si elimino una tupla en la Courses
relación, ¿eliminará todas las tuplas de referencia en la BookCourses
relación, o es al revés?
Categories
tabla tiene unaCourseID
clave primaria mientras que laCourses
tabla tiene la claveEntryID
. Realmente necesita repensar sus opciones de nombres.Respuestas:
Cascade funcionará cuando elimine algo de la tabla
Courses
. Cualquier registro en la tablaBookCourses
que tenga referencia a la tablaCourses
se eliminará automáticamente.Pero cuando intenta eliminar en la tabla,
BookCourses
solo la tabla en sí se ve afectada y no en elCourses
pregunta de seguimiento: ¿por qué tienes
CourseID
en la categoría de mesa?Tal vez deberías reestructurar tu esquema en esto,
fuente
Aquí hay un ejemplo simple para otros que visitan esta publicación anterior, pero el ejemplo en la pregunta lo confunde:
Entrega -> Paquete (Uno -> Muchos)
La entrada con la clave foránea Delivery_Id (Paquete) se elimina con la entidad referenciada en la relación FK (Entrega).
Por lo tanto, cuando se elimina una entrega, los paquetes que hacen referencia también se eliminarán. Si se elimina un Paquete, no pasa nada en ninguna entrega.
fuente