DELETE — elimina filas de una tabla
[ WITH [ RECURSIVE ]consulta_with[, ...] ] DELETE FROM [ ONLY ]nombre_tabla[ * ] [ [ AS ]alias] [ USINGelemento_from[, ...] ] [ WHEREcondición| WHERE CURRENT OFnombre_cursor] [ RETURNING [ WITH ( { OLD | NEW } ASalias_salida[, ...] ) ] { * |expresión_salida[ [ AS ]nombre_salida] } [, ...] ]
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.
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.
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.
o nombre_columnaOLD.*, y los nuevos valores se pueden devolver escribiendo
NEW.
o nombre_columnaNEW.*. 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_salidaUn nombre que se utilizará para una columna devuelta.
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.
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.
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.
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.