Este artículo sobre el SQL Delete forma parte de la serie SQL essential sobre sentencias, funciones y operaciones clave en SQL Server.
Eliminar una fila de una tabla se realiza a través de una sentencia de Lenguaje de Manipulación de Datos, también conocida como DML, utilizando la palabra clave delete. La operación de borrado de SQL es, con mucho, la más sencilla de todos los comandos DML. Al ejecutar el comando delete, no tenemos que preocuparnos de obtener ninguna forma de datos de la tabla, y no tenemos que preocuparnos de trabajar con los datos que obtenemos de la tabla(s). Simplemente le decimos a la base de datos que borre un registro específico, y lo hace o no lo hace. Es así de sencillo.
-
Nota: Para saber más sobre cómo utilizar la sentencia SQL Delete, lea el artículo Las mejores formas de utilizar la sentencia SQL Delete en una tabla SQL.
- Siempre se recomienda comenzar con una sentencia SELECT antes de eliminar algo para asegurarse de que está apuntando a los registros correctos. Así que la sentencia delete se utiliza para eliminar filas de una tabla utilizando la cláusula where para seleccionar sólo las filas que se van a eliminar
- Utiliza siempre un identificador único para localizar las filas que necesitas eliminar
- Para eliminar todas las filas de una tabla, utiliza siempre TRUNCATE TABLE. TRUNCATE TABLE que es más rápido que una sentencia SQL delete y utiliza menos recursos del sistema y del registro de transacciones
- Por defecto, las sentencias DELETE inducen un bloqueo exclusivo (X) en la tabla, y mantiene el bloqueo hasta que la transacción se completa
- Un bloqueo exclusivo impide que otra transacción modifique los datos; las operaciones de lectura se permiten con el uso de la pista NOLOCK o el nivel de aislamiento de lectura no comprometida
- Se recomienda especificar la pista TABLOCK en la sentencia delete. Este proceso permite la desasignación de páginas y el espacio asociado disponible para su reutilización por otros objetos de la base de datos
- Es una buena práctica crear un índice agrupado en la tabla del montón antes de ejecutar una sentencia delete
- Aunque es muy simple y muy potente, y el resultado de una sentencia Delete es destructivo. Las filas eliminadas no pueden ser recuperadas fácilmente
- Autor
- Postes recientes
- Una rápida visión de la auditoría de bases de datos en SQL – 28 de enero, 2021
- Cómo configurar Azure Data Sync entre las bases de datos de Azure SQL y SQL Server local – 20 de enero
- Cómo realizar operaciones de importación/exportación de bases de datos de Azure SQL mediante PowerShell – 14 de enero
En primer lugar, revisemos rápidamente cómo es una sentencia SQL delete. Tenemos que decirle a la base de datos y a la tabla de dónde debe eliminar los datos. Es una buena idea añadir una cláusula de condición para establecer el alcance del borrado de datos. De lo contrario, borrará todo lo que haya en la tabla.
Vamos a ver nuestra tabla y a eliminar algunos registros.
Cómo eliminar filas sin cláusula where
El siguiente ejemplo elimina todas las filas de la tabla Person.Person en la base de datos AdventureWorks2014. No hay ninguna restricción impuesta en la sentencia SQL de borrado utilizando una cláusula WHERE.
.
1
. 2
3
|
USE Adventureworks2014;
GO
DELETE FROM .;
|
Cómo eliminar filas con la cláusula where
El siguiente ejemplo elimina filas de la tabla . tabla de la base de datos AdventureWorks2014 en las que el valor de la columna businessEntityID es mayor que 30,000
1
2
3
4
|
Usa Adventureworks2014;
GO
DELETE FROM .
WHERE businessEntityID > 30000;
|
Nota: Un error desafortunado que puede ocurrir es ejecutar accidentalmente un SQL Delete sin cláusula Where y eliminar inadvertidamente todos sus datos. Para evitar que esto suceda, considere el uso de la función de guardia de ejecución en ApexSQL Complete, para advertir contra tales acciones potencialmente dañinas, antes de ejecutarlas. Más información: Alertas de ejecución
Cómo eliminar filas utilizando Top con cláusula where
El siguiente ejemplo elimina 50 filas aleatorias de la tabla Person.Person en la base de datos AdventureWorks2014. El valor del BusinessEntityID debe estar entre 30.000 y 40,000
1
2
3
4
|
Usa Adventureworks2014;
GO
DELETE TOP(50) FROM .
WHERE BusinessEntityID entre 30000 y 40000
|
Nota: La cláusula TOP (n) cuando se utiliza con la sentencia SQL Delete y cualquier sentencia DML (es decir. Select, Insert, Delete y Update), la operación se realiza sobre una selección aleatoria de un número de filas especificado en la cláusula Top.
Cómo eliminar filas duplicadas
En el mundo real, tendemos a recopilar datos de diferentes fuentes; no es raro tener registros duplicados. Una aproximación al problema de los duplicados es, en primer lugar, identificar dónde se han producido. Y ejecutar una consulta select en esas columnas.
El siguiente ejemplo utiliza el argumento PARTITION BY para particionar el conjunto de resultados de la consulta por todas las columnas de la tabla tb_spaceused. La función Row_Number (), es una función ventana, lo que significa que opera sobre un conjunto ordenado. La cláusula ORDER BY especificada en la cláusula OVER ordena las filas de cada partición por todas las columnas de la tabla tb_spaceused.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
CON CTE
AS (SELECT *,
ROW_NUMBER() OVER(PARTITION BY database_name,
database_size,
,
reserved,
datos,
tamaño_de_índice,
sin usar
Ordenar por nombre_de_base_de_datos
) AS Row_Num
FROM tb_spaceused)
SELECT *
FROM CTE
WHERE Row_Num <> 1;
|
Sustituir la sentencia Select por una Delete elimina todos los duplicados de la tabla.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
WITH CTE
AS (SELECT *,
ROW_NUMBER() OVER(PARTITION BY database_name,
database_size,
,
reserved,
datos,
tamaño_de_índice,
sin usar
Ordenar por nombre_de_base_de_datos
) AS Row_Num
FROM tb_spaceused)
–SELECT *
–FROM CTE
–WHERE Row_Num <> 1;
DELETE FROM CTE
WHERE Row_Num <> 1;
|
Cómo eliminar filas mediante subconsultas SQL-consultas
En el siguiente ejemplo, las filas de una tabla se eliminan en función de los datos de otra tabla. En los ejemplos, las filas de la tabla SalesPersonQuotaHistory se eliminan basándose en la columna SalesYTD de la tabla SalesPerson.
1
2
3
4
5
6
7
|
DELETE FROM Sales.SalesPersonQuotaHistory
WHERE BusinessEntityID IN
(
SELECT BusinessEntityID
FROM Sales.SalesPerson
WHERE SalesYTD > 4900000.00
);
GO
|
Cómo eliminar filas utilizando SQL Joins
En este apartado, utilizaremos la sentencia SQL Delete para eliminar los datos de la base de datos Adeventureworks2014. Eliminar datos, a primera vista, suena trivial, pero una vez que nos metemos en un diseño de base de datos grande las cosas pueden dejar de ser iguales y fáciles.
En muchos casos, las tablas están relacionadas a través de una relación de clave primaria y foránea. En el siguiente ejemplo, podemos ver un uso de joins para borrar los datos de la tabla Sales.SalesPersonQuotaHistory.
1
2
3
4
5
|
DELETE sq
FROM Sales.SalesPersonQuotaHistory sq
INNER JOIN Sales.SalesPerson sp ON sq.BusinessEntityID = sp.BusinessEntityID
WHERE sp.SalesYTD > 4500000.00;
GO
|
Cómo eliminar filas de una tabla remota utilizando servidores vinculados y OpenQuery
El siguiente ejemplo utiliza la sentencia SQL delete para eliminar filas de una tabla remota utilizando el servidor vinculado llamado, hqdbt01. A continuación, consulta la tabla remota utilizando la convención de nomenclatura de objetos de cuatropartes para eliminar las filas de la tabla remota
1
2
3
DELETE
FROM .AdventureWorks2014..
Donde ShiftID = 2;
|
El siguiente ejemplo, la tabla remota se consulta especificando la función OPENQUERY rowset junto con el comando delete.
1
2
3
|
DELETE OPENQUERY (hqdbt01, ‘SELECT *
FROM AdventureWorks2014.HumanResources.Department
WHERE DepartmentID = 18′);
|
Cómo eliminar filas utilizando SSMS
El uso de SQL Server Management Studio (SSMS), Graphical User Interface (GUI) para eliminar filas implica una búsqueda manual. En realidad, será mucho más fácil y rápido eliminar registros con una consulta SQL.
Vamos a localizar la tabla para utilizar una sentencia SQL de borrado, en este caso, se selecciona la tabla dbo.ciudades. Ahora, hacemos clic con el botón derecho del ratón y elegimos Editar las 200 primeras filas. Esta opción abre una ventana de diseño de consultas. A continuación, haga clic con el botón derecho del ratón en la ventana y seleccione Ejecutar SQL y escriba una nueva consulta que elimine filas de la tabla dbo.cities.
En el panel de resultados, asegúrese de que la sentencia SELECT está sacando los registros correctos de destino antes de empezar a eliminar filas. Seleccione las filas y haga clic con el botón derecho en las filas y elija Eliminar para eliminar las filas de la tabla.
Resumen
Hasta ahora, hemos visto muchas formas diferentes de utilizar la sentencia SQL delete para eliminar datos. Pero, hay una lista de las consideraciones a seguir mientras se utiliza la sentencia delete, y es como sigue:
Nota: Para recuperar las filas eliminadas vea Recuperación de desastres de SQL Server – Cómo recuperar rápidamente los datos perdidos debido a una operación de eliminación involuntaria
Eso es todo por ahora… Espero que disfrute de la lectura de este artículo sobre la sentencia SQL delete. Si tienes alguna pregunta, no dudes en comentar abajo.
Mi especialidad es el diseño de & soluciones de alta disponibilidad y migración de bases de datos multiplataforma. Las tecnologías en las que actualmente trabajo son SQL Server, PowerShell, Oracle y MongoDB.
Ver todos los posts de Prashanth Jayaram