Eliminar filas mediante DELETE

Actualizado: 14 de abril de 2006

La instrucción DELETE quita una o varias filas de una tabla o vista.

A continuación se expone una forma simplificada de la sintaxis de DELETE:

DELETE table_or_view

FROM table_sources

WHERE search_condition

El parámetro table_or_view indica la tabla o vista de la que se van a eliminar las filas. Se eliminarán todas las filas de table_or_view que reúnan los requisitos de la condición de búsqueda de la cláusula WHERE. Si no se especifica ninguna cláusula WHERE, se eliminarán todas las filas de table_or_view. La cláusula FROM especifica tablas o vistas y condiciones de combinación adicionales que los predicados de la condición de búsqueda de la cláusula WHERE pueden utilizar para calificar las filas que se eliminarán de table_or_view.. Las filas no se eliminan de las tablas mencionadas en la cláusula FROM, sólo de la tabla mencionada en table_or_view.

Las tablas de las que se quitan todas las filas permanecen en la base de datos. La instrucción DELETE sólo elimina filas de la tabla, pero la tabla en sí se debe quitar de la base de datos mediante la instrucción DROP TABLE.

Eliminar filas de un montón

Cuando se eliminan filas de un montón, Database Engine (Motor de base de datos) puede usar el bloqueo de fila o de página para la operación. Como resultado, las páginas que pasan a estar vacías debido a la operación de eliminación siguen asignadas al montón. Si no se cancela la asignación de las páginas vacías, otros objetos de la base de datos no pueden volver a utilizar el espacio asociado.

Para eliminar las filas de un montón y cancelar la asignación de las páginas, use uno de los métodos siguientes.

  • Especifique la sugerencia TABLOCK en la instrucción DELETE. El uso de la sugerencia TABLOCK hace que la operación de eliminación use un bloqueo compartido de la tabla, en lugar de un bloqueo de fila o de página. Esto permite cancelar la asignación de las páginas. Para obtener más información acerca de la sugerencia TABLOCK, vea Sugerencias de tabla (Transact-SQL).
  • Use TRUNCATE TABLE si se van a eliminar todas las filas de la tabla.
  • Cree un índice agrupado en el montón antes de eliminar las filas. Puede quitar el índice agrupado después de eliminarlas. Para este método se requiere más tiempo que para los métodos anteriores y usa más recursos temporales.

Para obtener más información acerca del bloqueo, vea Bloquear el motor de base de datos.

Ejemplos

En el ejemplo siguiente se eliminan todas las filas de la tabla SalesPersonQuotaHistory porque no se utiliza una cláusula WHERE para limitar el número de filas eliminadas.

USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory;
GO

En el ejemplo siguiente se eliminan todas las filas de la tabla ProductCostHistory en las que el valor de la columna StandardCost es superior a 1000.00.

USE AdventureWorks;
GO
DELETE FROM Production.ProductCostHistory
WHERE StandardCost > 1000.00;
GO

En este ejemplo se muestra la extensión de Transact-SQL que se utiliza para eliminar registros de una tabla base que se basa en una combinación o subconsulta correlacionada. La primera instrucción DELETE muestra la solución de subconsulta compatible con SQL-2003 y la segunda instrucción DELETE muestra la extensión de Transact-SQL. Ambas consultas quitan filas de la tabla SalesPersonQuotaHistory basándose en las ventas del año hasta la fecha almacenadas en la tabla SalesPerson.

-- SQL-2003 Standard subquery

USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
WHERE SalesPersonID IN 
    (SELECT SalesPersonID 
     FROM Sales.SalesPerson 
     WHERE SalesYTD > 2500000.00);
GO

-- Transact-SQL extension
USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
FROM Sales.SalesPersonQuotaHistory AS spqh
    INNER JOIN Sales.SalesPerson AS sp
    ON spqh.SalesPersonID = sp.SalesPersonID
WHERE sp.SalesYTD > 2500000.00;
GO

Vea también

Conceptos

Eliminar filas de conjuntos de resultados
Eliminar todas las filas mediante TRUNCATE TABLE
Limitar el número de filas eliminadas mediante TOP

Otros recursos

DROP TABLE (Transact-SQL)
DELETE (Transact-SQL)
Eliminar datos de una tabla

Ayuda e información

Obtener ayuda sobre SQL Server 2005

Historial de cambios

Versión Historial

14 de abril de 2006

Contenido nuevo:
  • Se agregó la sección "Eliminar filas de un montón".