DELETE ... RETURNING
Return columns from rows removed by a DELETE statement.
delete returning delete output
delete returning output
| Database | Status | Syntax Family | Min Version |
|---|---|---|---|
| PostgreSQL | full | returning | 8.2 |
| MySQL | none | - | - |
| MariaDB | full | returning | 10.0.5 |
| Oracle | full | returning-into | - |
| SQL Server | full | output | - |
| SQLite | full | returning | 3.35.0 |
| Redshift | none | - | - |
| DB2 | none | - | - |
| Snowflake | none | - | - |
| BigQuery | none | - | - |
Compare Databases
Database Details
PostgreSQL
full
DELETE FROM sessions
WHERE expires_at < NOW()
RETURNING id, user_id;- Works the same as INSERT/UPDATE RETURNING.
Docs: DELETE
MySQL
none
- No RETURNING clause for DELETE.
- Must SELECT before DELETE to capture deleted rows.
Docs: DELETE
MariaDB
full
DELETE FROM sessions
WHERE expires_at < NOW()
RETURNING id, user_id;- DELETE ... RETURNING supported since MariaDB 10.0.5.
Docs: DELETE ... RETURNING
Oracle
full
DELETE FROM t WHERE id = 1 RETURNING col INTO :v;- RETURNING...INTO requires a bind variable. Works in PL/SQL or via OCI/JDBC bind parameters. Not usable as plain SQL without a host variable.
- Multiple rows: RETURNING col BULK COLLECT INTO collection.
Docs: DELETE
SQL Server
full
DELETE FROM sessions
OUTPUT DELETED.id, DELETED.user_id
WHERE expires_at < GETDATE();- Uses OUTPUT clause with DELETED pseudo-table.
Docs: OUTPUT Clause
SQLite
full
DELETE FROM sessions
WHERE expires_at < datetime('now')
RETURNING id, user_id;- Added in SQLite 3.35.0 alongside INSERT/UPDATE RETURNING.
Docs: RETURNING
Redshift
none
- Redshift does not support RETURNING on DELETE. Use a SELECT before the DELETE to capture row data, or use a CTE: WITH deleted AS (SELECT * FROM t WHERE condition) DELETE FROM t USING deleted WHERE t.id = deleted.id.
Docs: DELETE
DB2
none
- DB2 does not support RETURNING on DELETE. Use SELECT ... FROM OLD TABLE (DELETE FROM t WHERE ...) for a similar effect - the "data change table reference" syntax returns deleted rows. Example: SELECT id, name FROM OLD TABLE (DELETE FROM t WHERE status = 'expired');
Docs: SELECT
Snowflake
none
- Snowflake does not support a RETURNING clause on DELETE. Capture needed data with a SELECT before deleting, or stage data in a temporary table first.
Docs: DELETE
BigQuery
none
- BigQuery does not support RETURNING on DELETE. Use a SELECT or CREATE TABLE AS SELECT to save rows before deletion.
Docs: BigQuery DML syntax