w3resource

Dropping All Tables in a PostgreSQL Database


How to Drop All Tables in PostgreSQL Database?

Dropping all tables in a PostgreSQL database can be useful for clearing out data or resetting the database structure. This guide provides a few methods to delete all tables, including SQL commands and the psql command-line interface.

1. Using DROP SCHEMA to Remove All Tables

The simplest way to drop all tables in a PostgreSQL database is to drop the entire schema containing them. Dropping a schema removes all tables, views, sequences, and other objects within it.

Syntax:

DROP SCHEMA schema_name CASCADE;

Example Code:

-- Drop all tables by removing the 'public' schema
DROP SCHEMA public CASCADE;      -- Drop the public schema and all its objects
-- Recreate the 'public' schema to use it again
CREATE SCHEMA public;            -- Recreate the default 'public' schema

Explanation:

  • DROP SCHEMA public CASCADE;: Drops the public schema, including all tables and objects within it. The CASCADE option ensures that all dependent objects are removed.
  • CREATE SCHEMA public;: Recreates the public schema so new tables can be created within it again.

2. Using a Dynamic SQL Query to Drop All Tables

If you need more control or do not want to drop the schema, you can generate DROP TABLE statements dynamically for each table.

Syntax:

DO $$ 
BEGIN
    EXECUTE (
        SELECT string_agg('DROP TABLE IF EXISTS ' || tablename || ' CASCADE;', ' ')
        FROM pg_tables
        WHERE schemaname = 'public'
    );
END $$;

Example Code:

-- Generate and execute DROP TABLE statements for all tables in 'public'
DO $$                                               -- Start an anonymous code block
BEGIN                                               
    EXECUTE (                                       -- Execute a dynamically generated command
        SELECT string_agg('DROP TABLE IF EXISTS ' || tablename || ' CASCADE;', ' ') -- Concatenate DROP statements
        FROM pg_tables                              -- From system table containing table information
        WHERE schemaname = 'public'                 -- Limit to tables in the 'public' schema
    );                                             
END $$;                                             -- End of code block

Explanation:

  • DO $$ ... $$: An anonymous code block in PostgreSQL.
  • string_agg(...): Aggregates DROP TABLE commands for each table, concatenated as a single command.
  • WHERE schemaname = 'public': Limits to tables within the public schema.

3. Using psql Command-Line Interface to Drop All Tables

In the psql interface, you can use a similar approach by executing the generated DROP TABLE commands directly.

Example Code:

-- Connect to the PostgreSQL database via psql
psql -U postgres -d your_database
-- Drop all tables using a dynamic SQL query
DO $$ 
BEGIN
    EXECUTE (
        SELECT string_agg('DROP TABLE IF EXISTS ' || tablename || ' CASCADE;', ' ')
        FROM pg_tables
        WHERE schemaname = 'public'
    );
END $$;

Explanation:

  • psql -U postgres -d your_database: Connect to the database using psql. Replace your_database with your database’s name.
  • The DO $$ ... $$ block drops all tables by generating and executing a single command.

Important Notes

  • Data Loss: Dropping tables removes all data within them. Make sure to back up important data before running these commands.
  • Schema Selection: Adjust the schema name (like public) in the code to target other schemas as needed.
  • Dependencies: Use CASCADE to drop dependent objects; otherwise, PostgreSQL will raise errors if any object depends on the tables.

All PostgreSQL Questions, Answers, and Code Snippets Collection.



Become a Patron!

Follow us on Facebook and Twitter for latest update.

It will be nice if you may share this link in any developer community or anywhere else, from where other developers may find this content. Thanks.

https://w3resource.com/PostgreSQL/snippets/how-to-drop-all-tables-in-postgresql-database.php