Eliminar filas mediante DELETE

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, 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 AdventureWorks2008R2;
    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 AdventureWorks2008R2;
    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 ISO 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 AdventureWorks2008R2;
    GO
    DELETE FROM Sales.SalesPersonQuotaHistory 
    WHERE BusinessEntityID IN 
        (SELECT BusinessEntityID 
         FROM Sales.SalesPerson 
         WHERE SalesYTD > 2500000.00);
    GO

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