En SQL Server, la instrucción DELETE se utiliza para eliminar registros de una tabla. Es una de las cuatro operaciones básicas en el almacenamiento persistente, conocidas como CRUD (Crear, Leer, Actualizar, Eliminar). La instrucción DELETE es esencial para gestionar los períodos de retención de datos y garantizar el cumplimiento de las normativas regulatorias.
Veamos la instrucción DELETE y sus diversos casos de uso:
Eliminación de un solo registro
El ejemplo más simple de la instrucción DELETE es eliminar un solo registro de una tabla. Aquí tienes un ejemplo:
-- Seleccionar detalles del pedido
SELECT *
FROM [Sales].[SalesOrderDetail]
WHERE [SalesOrderId] = 46599;
-- Eliminar detalles del pedido
DELETE
FROM [Sales].[SalesOrderDetail]
WHERE [SalesOrderId] = 46599;
Este código selecciona un registro específico de la tabla [SalesOrderDetail] y luego lo elimina. La instrucción SELECT se utiliza para verificar la corrección de las cláusulas FROM y WHERE antes de ejecutar la instrucción DELETE.
Consistencia lógica
Cuando se eliminan registros, es importante mantener la consistencia lógica en la base de datos. Por ejemplo, si un registro padre no tiene registros hijos, puede generar problemas de integridad de datos. Hay dos formas de manejar esta situación:
- Manejarlo en la capa de aplicación solicitando al usuario que elimine el registro padre cuando se elimine el último registro hijo.
- Escribir un proceso de limpieza que elimine los registros padres sin registros hijos después de un cierto período de tiempo.
Aquí tienes un ejemplo de uso de LEFT JOIN para identificar registros padres sin registros hijos:
-- Seleccionar detalles del encabezado
SELECT H.SalesOrderID, D.SalesOrderDetailID
FROM [Sales].[SalesOrderHeader] AS H
LEFT JOIN [Sales].[SalesOrderDetail] AS D ON H.SalesOrderID = D.SalesOrderID
WHERE H.[SalesOrderId] = 46599;
-- Eliminar detalles del encabezado
DELETE
FROM [Sales].[SalesOrderHeader]
WHERE [SalesOrderId] = 46599;
Este código selecciona los detalles del encabezado de la tabla [SalesOrderHeader] y los detalles correspondientes de los hijos de la tabla [SalesOrderDetail] utilizando un LEFT JOIN. La cláusula WHERE filtra el registro padre sin registros hijos. La instrucción DELETE luego elimina el registro padre seleccionado.
Transacciones explícitas
De forma predeterminada, la instrucción DELETE se ejecuta como una transacción implícita. Sin embargo, en algunos casos, es necesario utilizar transacciones explícitas para controlar el proceso de eliminación. Aquí tienes un ejemplo:
-- Encontrar el número esperado de registros
SELECT *
FROM [HumanResources].[EmployeePayHistory]
WHERE ModifiedDate >= '2000-07-01' AND ModifiedDate < '2014-01-01';
-- Iniciar transacción
BEGIN TRAN;
-- Utilizar alias
DELETE
FROM H
FROM [HumanResources].[EmployeePayHistory] AS H
WHERE ModifiedDate >= '2000-07-01' AND ModifiedDate < '2014-01-01';
-- Mostrar el número de registros afectados
PRINT @@ROWCOUNT
-- Confirmar o deshacer la transacción
/*
COMMIT TRAN
ROLLBACK TRAN
*/
Este código selecciona los registros de historial de pagos de empleados entre los años 2000 y 2014 y luego los elimina dentro de una transacción explícita. La función @@ROWCOUNT se utiliza para mostrar el número de registros afectados por la instrucción DELETE. Finalmente, la transacción se confirma o se deshace según el resultado deseado.
Copia de tabla
A veces es útil crear una copia de una tabla antes de realizar cualquier eliminación. Esto se puede hacer utilizando esquemas y la instrucción SELECT INTO. Aquí tienes un ejemplo:
-- Crear nuevo esquema
CREATE SCHEMA bac AUTHORIZATION dbo;
-- Hacer copia de la tabla
SELECT *
INTO bac.EmailAddress
FROM Person.EmailAddress;
Este código crea un nuevo esquema llamado [bac] y luego copia los datos de la tabla [Person].[EmailAddress] a una nueva tabla llamada [bac].[EmailAddress]. Esta técnica te permite trabajar con una copia de la tabla sin afectar los datos originales.
Instrucciones DELETE complejas
La instrucción DELETE se puede utilizar para eliminar registros basados en condiciones de búsqueda complejas. Aquí tienes un ejemplo de eliminación de registros utilizando dos condiciones de búsqueda en la cláusula WHERE:
-- Mostrar las direcciones de correo electrónico antiguas de John
SELECT *
FROM [Person].[EmailAddress]
WHERE YEAR([ModifiedDate]) IN (2005, 2006, 2007, 2008, 2009, 2010) AND EmailAddress LIKE 'john%';
-- Eliminar las direcciones de correo electrónico antiguas de John
DELETE
FROM [Person].[EmailAddress]
WHERE YEAR([ModifiedDate]) IN (2005, 2006, 2007, 2008, 2009, 2010) AND EmailAddress LIKE 'john%';
Este código selecciona las direcciones de correo electrónico entre los años 2005 y 2010 que comienzan con el nombre “john” y luego las elimina. La instrucción DELETE utiliza las mismas condiciones de búsqueda que la instrucción SELECT para identificar los registros que se van a eliminar.
Eliminación desde fuentes de datos remotas
En SQL Server, también puedes eliminar registros de fuentes de datos remotas utilizando servidores vinculados o funciones de conjunto de filas. Aquí tienes un ejemplo utilizando un servidor vinculado:
-- Utilizando notación de 4 partes con servidor vinculado
DELETE
FROM S
FROM MyAzureDb.dbs4advwrks.dbo.FactInternetSales AS S
WHERE S.SalesOrderNumber < 'SO43700';
Este código elimina registros de la tabla [FactInternetSales] en una base de datos remota utilizando un servidor vinculado llamado [MyAzureDb]. La cláusula WHERE especifica la condición para eliminar los registros.
Registro de transacciones
Cuando se realizan eliminaciones, es importante considerar el impacto en el registro de transacciones. La instrucción DELETE se registra completamente, lo que significa que genera un gran número de entradas de registro. Por otro lado, la instrucción TRUNCATE TABLE se registra de forma mínima, lo que resulta en menos entradas de registro. Se recomienda utilizar TRUNCATE TABLE cuando se borran todos los datos de una tabla.
Estos son solo algunos de los muchos aspectos de la instrucción DELETE en SQL Server. Es una herramienta poderosa para gestionar datos y garantizar la integridad de los datos. Comprender sus diversos casos de uso y consideraciones puede ayudarte a tomar decisiones informadas al trabajar con bases de datos de SQL Server.
Recuerda siempre probar tu código en un entorno de laboratorio antes de aplicarlo a bases de datos de producción.
Eso es todo para este tutorial sobre la instrucción DELETE en SQL Server. Espero que te haya resultado informativo y útil. ¡Feliz codificación!