ON DELETE | Especificar acción al eliminar filas de una tabla

En SQL, la cláusula ON DELETE se utiliza para especificar la acción que se debe realizar cuando se elimina una fila de una tabla que tiene una relación de clave externa (FK) con otra tabla.

Existen cuatro opciones de acción que se pueden especificar con la cláusula ON DELETE.

 

CASCADE

Supongamos que tenemos dos tablas: «Departamentos» y «Empleados».

La tabla «Empleados» tiene una clave externa (FK) que hace referencia al campo «IdDepartamento» de la tabla «Departamentos».

La relación entre ambas tablas se puede establecer de la siguiente manera:

CREATE TABLE Departamentos (
  IdDepartamento INT PRIMARY KEY,
  NombreDepartamento VARCHAR(50)
);

CREATE TABLE Empleados (
  IdEmpleado INT PRIMARY KEY,
  NombreEmpleado VARCHAR(50),
  IdDepartamento INT,
  FOREIGN KEY (IdDepartamento) REFERENCES Departamentos(IdDepartamento) ON DELETE CASCADE
);

En este ejemplo, la cláusula ON DELETE se especifica después de la declaración de la clave externa en la tabla «Empleados» y se establece en «CASCADE».

Esto significa que, cuando se elimina una fila de la tabla «Departamentos», todas las filas correspondientes en la tabla «Empleados» que hacen referencia a esa fila eliminada también se eliminarán automáticamente.

 

SET NULL

Ahora supongamos que queremos establecer una clave externa en la tabla «Pedidos» que haga referencia al campo «IdCliente» de la tabla «Clientes».

La relación entre ambas tablas se puede establecer de la siguiente manera:

CREATE TABLE Clientes (
  IdCliente INT PRIMARY KEY,
  NombreCliente VARCHAR(50)
);

CREATE TABLE Pedidos (
  IdPedido INT PRIMARY KEY,
  FechaPedido DATE,
  IdCliente INT,
  FOREIGN KEY (IdCliente) REFERENCES Clientes(IdCliente) ON DELETE SET NULL
);

En este ejemplo, la cláusula ON DELETE se especifica después de la declaración de la clave externa en la tabla «Pedidos» y se establece en «SET NULL».

Esto significa que, cuando se elimina una fila de la tabla «Clientes», todas las filas correspondientes en la tabla «Pedidos» que hacen referencia a esa fila eliminada tendrán su valor de «IdCliente» establecido en NULL.

 

NO ACTION

Por último, supongamos que queremos establecer una clave externa en la tabla «Calificaciones» que haga referencia al campo «IdEstudiante» de la tabla «Estudiantes».

La relación entre ambas tablas se puede establecer de la siguiente manera:

CREATE TABLE Estudiantes (
  IdEstudiante INT PRIMARY KEY,
  NombreEstudiante VARCHAR(50)
);

CREATE TABLE Calificaciones (
  IdCalificacion INT PRIMARY KEY,
  Nota INT,
  IdEstudiante INT,
  FOREIGN KEY (IdEstudiante) REFERENCES Estudiantes(IdEstudiante) ON DELETE NO ACTION
);

En este ejemplo, la cláusula ON DELETE se especifica después de la declaración de la clave externa en la tabla «Calificaciones» y se establece en «NO ACTION».

Esto significa que no se realizará ninguna acción cuando se intente eliminar una fila de la tabla «Estudiantes» que tenga una o más filas correspondientes en la tabla «Calificaciones».

 

RESTRICT

Supongamos que tenemos dos tablas: «Autores» y «Libros».

La tabla «Libros» tiene una clave externa (FK) que hace referencia al campo «IdAutor» de la tabla «Autores».

La relación entre ambas tablas se puede establecer de la siguiente manera:

CREATE TABLE Autores (
  IdAutor INT PRIMARY KEY,
  NombreAutor VARCHAR(50)
);

CREATE TABLE Libros (
  IdLibro INT PRIMARY KEY,
  TituloLibro VARCHAR(50),
  IdAutor INT,
  FOREIGN KEY (IdAutor) REFERENCES Autores(IdAutor) ON DELETE RESTRICT
);

En este ejemplo, la cláusula ON DELETE se especifica después de la declaración de la clave externa en la tabla «Libros» y se establece en «RESTRICT».

Esto significa que, cuando se intenta eliminar una fila de la tabla «Autores», se realizará una comprobación para ver si hay filas correspondientes en la tabla «Libros» que hacen referencia a esa fila eliminada. Si se encuentra una o más filas correspondientes, se producirá un error y no se permitirá la eliminación de la fila de la tabla «Autores».

En otras palabras, la cláusula ON DELETE RESTRICT establece una restricción en la eliminación de filas en la tabla principal («Autores» en este caso) cuando existen filas correspondientes en la tabla secundaria («Libros» en este caso) que hacen referencia a esa fila eliminada.

Esto evita que se eliminen accidentalmente filas de la tabla principal que tienen dependencias en la tabla secundaria, lo que podría causar inconsistencias en la base de datos.