Sentencia DELETE en SQL

DELETE es el comando DML para eliminar registros de las tablas de base de datos.

La sintaxis de la sentencia es sencilla:

**DELETE FROM** `nombreTabla` **WHERE** condiciones;

Al igual que ocurre con la sentencia UPDATE, es muy importante tener en cuenta la cláusula WHERE, para evitar que los cambios en la tabla se propaguen a todos los registros, eliminándolos en su totalidad.

En el caso de desear eliminar todos los registros de una tabla, es más óptimo utilizar la sentencia TRUNCATE, ya que es más rápida y eficiente, utilizando menos recursos del sistema y del registro de transacciones.

Para ejemplificar el funcionamiento de la sentencia DELETE, vamos a eliminar algunos registros de las tablas Clientes y Pedidos.

Después de cada DELETE, dejaremos los scripts de INSERT INTO, para volver a restaurar los registros.

En este ejemplo, nos proponemos a eliminar al cliente Ignacio:

Ejecutamos el DELETE y nos indicara que 1 fila ha sido afectada. Si buscamos dicho registro, veremos que ha desaparecido de nuestra tabla Clientes:

DELETE FROM Clientes
WHERE idClientes = 7;

A continuación, dejamos el script para volver a insertar el registro.

INSERT INTO Clientes
    (idClientes,
     nombre,
     apellidos,
     direccion,
     cuenta)
VALUES
    (7,
    'Ignacio',
    'Herrero Domínguez',
    'C/ del girasol 3',
    998766549);

Recordamos que para poder especificar el valor de un campo con la propiedad IDENTITY, debemos ejecutar primero esta sentencia antes del INSERT INTO:

SET IDENTITY_INSERT Clientes ON;

Debemos tener especial atención con las restricciones de claves principalmente. Si por ejemplo, quisiéramos eliminar el cliente María con idClientes = 2, veremos que la ejecución de la sentencia devuelve el siguiente error:

DELETE FROM Clientes WHERE idClientes = 2;

Instrucción DELETE en conflicto con la restricción REFERENCE ‘fk_clientes_pedido’. El conflicto ha aparecido en la base de datos ‘tienda’, tabla ‘dbo.Pedidos’, column ‘idClientes’

Para eliminar a María, tendríamos que eliminar previamente los registros en la tabla Pedidos asociados a dicho cliente:

DELETE FROM Pedidos WHERE idClientes = 2;

La ejecución nos indicará que 2 filas han sido afectadas, pudiendo eliminar ahora al cliente María, ya que su idClientes no estará presente en la tabla Pedidos. A continuación, dejamos los scripts para volver a insertar los registros de las tablas Clientes y Pedidos:

INSERT INTO Clientes
    (idClientes,
     nombre,
     apellidos,
     direccion,
     cuenta)
VALUES
    (2,
    'María',
    'López Ruiz',
    'C/ de Alcalá 138',
    123456789);
INSERT INTO  Pedidos
    (idPedidos,
     producto,
     descripcionProducto,
     precio,
     fechaPedido,
     numeroProductos,
     idClientes)
VALUES
    (2,
    'Play Station 5',
    'Consola Sony',
    '549.95',
    '2022-07-18',
    4,
    2);
INSERT INTO  Pedidos
    (idPedidos,
     producto,
     descripcionProducto,
     precio,
     fechaPedido,
     numeroProductos,
     idClientes)
VALUES
    (3,
    'Xbox series X',
    'Consola Xbox',
    '499.99',
    '2022-01-21',
    2,
    2);

Como el resto de comandos DML, se pueden especificar varias condiciones en el WHERE para filtrar los registros deseados:

DELETE FROM Pedidos
WHERE fechaPedido
BETWEEN '2022-01-01' AND '2022-07-31'
AND descripcionProducto LIKE '%Consola%';

Esta sentencia eliminaría igualmente los registros de la tabla Pedidos con idPedidos 2 y 3 respectivamente.

En el caso de querer eliminar el valor de una columna/s determinada/s, deberemos utilizar la sentencia UPDATE, ya que DELETE elimina el registro entero.

Es posible también, utilizar DELETE en tablas cruzadas por alguna cláusula JOIN:

DELETE C FROM Clientes C
INNER JOIN Pedidos P
ON C.idClientes = P.idClientes
WHERE P.precio > 10000;

En este caso, al no haber en la tabla Pedidos, ningún producto con un precio mayor a 10000 euros, no se ha eliminado ningún registro de la tabla.