DELETE

DELETE — elimina filas de una tabla

Synopsis

[ WITH [ RECURSIVE ] consulta_with [, ...] ]
DELETE FROM [ ONLY ] nombre_tabla [ * ] [ [ AS ] alias ]
    [ USING elemento_from [, ...] ]
    [ WHERE condición | WHERE CURRENT OF nombre_cursor ]
    [ RETURNING [ WITH ( { OLD | NEW } AS alias_salida [, ...] ) ]
                { * | expresión_salida [ [ AS ] nombre_salida ] } [, ...] ]

Descripción

DELETE elimina de la tabla especificada las filas que cumplen la cláusula WHERE. Si la cláusula WHERE no está presente, el efecto es eliminar todas las filas de la tabla. El resultado es una tabla válida, pero vacía.

Tip

TRUNCATE proporciona un mecanismo más rápido para eliminar todas las filas de una tabla.

Hay dos formas de eliminar filas en una tabla utilizando información contenida en otras tablas de la base de datos: utilizando subconsultas o especificando tablas adicionales en la cláusula USING. La técnica más adecuada depende de las circunstancias específicas.

La cláusula opcional RETURNING hace que DELETE calcule y devuelva valores basados en cada fila realmente eliminada. Se puede calcular cualquier expresión que utilice las columnas de la tabla y/o las columnas de otras tablas mencionadas en USING. La sintaxis de la lista RETURNING es idéntica a la de la lista de salida de SELECT.

Debes tener el privilegio DELETE en la tabla para eliminar de ella, así como el privilegio SELECT para cualquier tabla en la cláusula USING o cuyos valores se lean en la condición.

Parámetros

consulta_with

La cláusula WITH te permite especificar una o más subconsultas a las que se puede hacer referencia por nombre en la consulta DELETE. Consulta la Section 7.8 y la SELECT para obtener más detalles.

nombre_tabla

El nombre (opcionalmente calificado por esquema) de la tabla de la que se van a eliminar filas. Si se especifica ONLY antes del nombre de la tabla, las filas coincidentes se eliminan únicamente de la tabla nombrada. Si no se especifica ONLY, las filas coincidentes también se eliminan de cualquier tabla que herede de la tabla nombrada. Opcionalmente, se puede especificar * después del nombre de la tabla para indicar explícitamente que se incluyen las tablas descendientes.

alias

Un nombre sustituto para la tabla de destino. Cuando se proporciona un alias, este oculta completamente el nombre real de la tabla. Por ejemplo, dado DELETE FROM foo AS f, el resto de la sentencia DELETE debe referirse a esta tabla como f y no como foo.

elemento_from

Una expresión de tabla que permite que aparezcan columnas de otras tablas en la condición WHERE. Utiliza la misma sintaxis que la cláusula FROM de una sentencia SELECT; por ejemplo, se puede especificar un alias para el nombre de la tabla. No repitas la tabla de destino como un elemento_from a menos que desees configurar un self-join (en cuyo caso debe aparecer con un alias en el elemento_from).

condición

Una expresión que devuelve un valor de tipo boolean. Solo se eliminarán las filas para las cuales esta expresión devuelva true.

nombre_cursor

El nombre del cursor que se utilizará en una condición WHERE CURRENT OF. La fila que se va a eliminar es la que se ha recuperado más recientemente de este cursor. El cursor debe ser una consulta que no realice agrupaciones sobre la tabla de destino de DELETE. Ten en cuenta que no se puede especificar WHERE CURRENT OF junto con una condición booleana. Consulta la DECLARE para obtener más información sobre el uso de cursores con WHERE CURRENT OF.

alias_salida

Un nombre sustituto opcional para las filas OLD o NEW en la lista RETURNING.

Por defecto, los valores antiguos de la tabla de destino se pueden devolver escribiendo OLD.nombre_columna o OLD.*, y los nuevos valores se pueden devolver escribiendo NEW.nombre_columna o NEW.*. Cuando se proporciona un alias, estos nombres quedan ocultos y se debe hacer referencia a las filas antiguas o nuevas utilizando el alias. Por ejemplo: RETURNING WITH (OLD AS o, NEW AS n) o.*, n.*.

expresión_salida

Una expresión que el comando DELETE calculará y devolverá después de que se elimine cada fila. La expresión puede utilizar cualquier nombre de columna de la tabla especificada por nombre_tabla o de las tablas listadas en USING. Escribe * para devolver todas las columnas.

Un nombre de columna o * se puede calificar utilizando OLD o NEW, o el correspondiente alias_salida para OLD o NEW, para hacer que se devuelvan los valores antiguos o nuevos. Un nombre de columna sin calificar, o *, o un nombre de columna o * calificado con el nombre o alias de la tabla de destino devolverá los valores antiguos.

Para un DELETE simple, todos los nuevos valores serán NULL. Sin embargo, si una regla ON DELETE hace que se ejecute un INSERT o un UPDATE en su lugar, los nuevos valores pueden ser distintos de NULL.

nombre_salida

Un nombre que se utilizará para una columna devuelta.

Salidas

Al completarse con éxito, un comando DELETE devuelve una etiqueta de comando de la forma

DELETE cantidad

Donde cantidad es el número de filas eliminadas. Ten en cuenta que el número puede ser menor que el número de filas que coincidieron con la condición cuando las eliminaciones fueron suprimidas por un disparador (trigger) BEFORE DELETE. Si cantidad es 0, la consulta no eliminó ninguna fila (esto no se considera un error).

Si el comando DELETE contiene una cláusula RETURNING, el resultado será similar al de una sentencia SELECT que contiene las columnas y valores definidos en la lista RETURNING, calculados sobre las filas eliminadas por el comando.

Notas

PostgreSQL te permite hacer referencia a columnas de otras tablas en la condición WHERE especificando las otras tablas en la cláusula USING. Por ejemplo, para eliminar todas las películas producidas por un productor determinado, se puede hacer:

DELETE FROM films USING producers
  WHERE producer_id = producers.id AND producers.name = 'foo';

Lo que esencialmente ocurre aquí es un join entre films y producers, donde todas las filas de films que se unieron con éxito se marcan para su eliminación. Esta sintaxis no es estándar. Una forma más estándar de hacerlo es:

DELETE FROM films
  WHERE producer_id IN (SELECT id FROM producers WHERE name = 'foo');

En algunos casos, el estilo con join es más fácil de escribir o más rápido de ejecutar que el estilo con subconsulta.

Ejemplos

Elimina todas las películas excepto los musicales:

DELETE FROM films WHERE kind <> 'Musical';

Vacía la tabla films:

DELETE FROM films;

Elimina las tareas completadas, devolviendo todos los detalles de las filas eliminadas:

DELETE FROM tasks WHERE status = 'DONE' RETURNING *;

Elimina la fila de tasks en la que está posicionado actualmente el cursor c_tasks:

DELETE FROM tasks WHERE CURRENT OF c_tasks;

Aunque no existe una cláusula LIMIT para DELETE, es posible obtener un efecto similar utilizando el mismo método descrito en la documentación de UPDATE:

WITH delete_batch AS (
  SELECT l.ctid FROM user_logs AS l
    WHERE l.status = 'archived'
    ORDER BY l.creation_date
    FOR UPDATE
    LIMIT 10000
)
DELETE FROM user_logs AS dl
  USING delete_batch AS del
  WHERE dl.ctid = del.ctid;

Este uso de ctid solo es seguro porque la consulta se ejecuta repetidamente, lo que evita el problema de la modificación de los valores de ctid.

Compatibilidad

Este comando cumple con el estándar SQL, excepto que las cláusulas USING y RETURNING son extensiones de PostgreSQL, al igual que la capacidad de usar WITH con DELETE.

Véase también

TRUNCATE