¿Cómo puedo eliminar todas las tablas en una base de datos PostgreSQL?

Resuelto AP257 asked hace 14 años • 0 respuestas

¿Cómo puedo eliminar todas las tablas en PostgreSQL, trabajando desde la línea de comandos?

No quiero eliminar la base de datos en sí, solo todas las tablas y todos los datos que contienen.

AP257 avatar Jul 25 '10 06:07 AP257
Aceptado

Si todas sus tablas están en un solo esquema, este enfoque podría funcionar (el código siguiente supone que el nombre de su esquema es public)

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;

Si está utilizando PostgreSQL 9.3 o posterior, es posible que también necesite restaurar las concesiones predeterminadas.

GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
Derek Slife avatar Dec 11 '2012 15:12 Derek Slife

Puede escribir una consulta para generar un script SQL como este:

select 'drop table "' || tablename || '" cascade;' from pg_tables;

O:

select 'drop table if exists "' || tablename || '" cascade;' from pg_tables;

En caso de que algunas tablas se eliminen automáticamente debido a la opción de cascada en una oración anterior.

Además, como se indica en los comentarios, es posible que desee filtrar las tablas que desea eliminar por nombre de esquema:

select 'drop table if exists "' || tablename || '" cascade;' 
  from pg_tables
 where schemaname = 'public'; -- or any other schema

Y luego ejecútelo.

El glorioso COPY+PASTE también funcionará.

Pablo Santa Cruz avatar Jul 24 '2010 23:07 Pablo Santa Cruz

La respuesta más aceptada al momento de escribir este artículo (enero de 2014) es:

drop schema public cascade;
create schema public;

Esto funciona, sin embargo, si su intención es restaurar el esquema público a su estado original, esto no cumple completamente la tarea. En pgAdmin III para PostgreSQL 9.3.1, si hace clic en el esquema "público" creado de esta manera y mira en el "panel SQL", verá lo siguiente:

-- Schema: public

-- DROP SCHEMA public;

CREATE SCHEMA public
  AUTHORIZATION postgres;

Sin embargo, por el contrario, una base de datos nueva tendrá lo siguiente:

-- Schema: public

-- DROP SCHEMA public;

CREATE SCHEMA public
  AUTHORIZATION postgres;

GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
COMMENT ON SCHEMA public
  IS 'standard public schema';

Para mí, usar un marco web Python que crea tablas de bases de datos (web2py), usar el primero causó problemas:

<class 'psycopg2.ProgrammingError'> no schema has been selected to create in 

Entonces, en mi opinión, la respuesta totalmente correcta es:

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
COMMENT ON SCHEMA public IS 'standard public schema';

También tenga en cuenta que para emitir estos comandos en pgAdmin III, utilicé la herramienta de consulta (icono de lupa "Ejecutar consultas SQL arbitrarias") o puede usar Complementos-> Consola PSQL

Nota

Si tiene alguna extensión instalada, se eliminará cuando elimine el esquema, por lo que debe tomar nota de lo que necesita instalar y luego ejecutar las declaraciones según sea necesario. P.ej

CREATE EXTENSION postgis;

User avatar Jan 21 '2014 00:01 User

Puedes eliminar todas las tablas con

DO $$ DECLARE
    r RECORD;
BEGIN
    -- if the schema you operate on is not "current", you will want to
    -- replace current_schema() in query with 'schematodeletetablesfrom'
    -- *and* update the generate 'DROP...' accordingly.
    FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP
        EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
    END LOOP;
END $$;

En mi opinión, esto es mejor que drop schema public, porque no es necesario recrear schemay restaurar todas las subvenciones.

La ventaja adicional es que esto no requiere un lenguaje de secuencias de comandos externo ni copiar y pegar el SQL generado en el intérprete.

Piotr Findeisen avatar Mar 15 '2016 22:03 Piotr Findeisen

Si todo lo que deseas eliminar es propiedad del mismo usuario, entonces puedes usar:

drop owned by the_user;

Esto eliminará todo lo que posee el usuario.

Eso incluye vistas materializadas, vistas, secuencias, activadores, esquemas, funciones, tipos, agregados, operadores, dominios, etc. (en realidad: todo ) que the_userposee (=creado).

Debe reemplazarlo the_usercon el nombre de usuario real; actualmente no hay ninguna opción para descartar todo para "el usuario actual". La próxima versión 9.5 tendrá la opción drop owned by current_user.

Más detalles en el manual: http://www.postgresql.org/docs/current/static/sql-drop-owned.html

 avatar Dec 01 '2015 07:12