sqlbeginner
INSERT ... RETURNING for Immediate Results
Use RETURNING clause to get inserted rows immediately without a separate SELECT query.
sqlPress ⌘/Ctrl + Shift + C to copy
-- Basic RETURNING
INSERT INTO users (name, email)
VALUES ('Alice', 'alice@example.com')
RETURNING id, created_at;
-- Bulk insert with RETURNING
INSERT INTO tags (name)
VALUES ('javascript'), ('typescript'), ('react')
RETURNING id, name;
-- CTE chained insert
WITH new_user AS (
INSERT INTO users (name, email)
VALUES ('Bob', 'bob@example.com')
RETURNING id
)
INSERT INTO user_profiles (user_id, bio)
SELECT id, 'New user'
FROM new_user
RETURNING *;
-- UPDATE ... RETURNING
UPDATE orders
SET status = 'shipped', shipped_at = NOW()
WHERE id = 42
RETURNING id, status, shipped_at;
-- DELETE ... RETURNING
DELETE FROM sessions
WHERE expires_at < NOW()
RETURNING user_id, expires_at;Use Cases
- getting generated IDs
- chained inserts
- avoiding round trips
Tags
Related Snippets
Similar patterns you can reuse in the same workflow.
sqlintermediate
SQL Upsert and Merge Patterns
Insert or update records atomically using ON CONFLICT, MERGE, and database-specific upsert syntax.
Best for: Syncing data from external sources
#sql#upsert
sqladvanced
Array and UNNEST Operations
Work with array columns using UNNEST, ARRAY_AGG, and array operators in PostgreSQL.
Best for: tag systems
#sql#arrays
sqladvanced
Row-Level Security Policies
Enforce data access rules at the database level with PostgreSQL Row-Level Security policies.
Best for: Multi-tenant databases
#security#rls
sqladvanced
Table Partitioning by Range
Partition large tables by date range for faster queries and easier data lifecycle management.
Best for: Time-series data
#partitioning#performance