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.