Pregunta ¿Dejar caer todas las tablas en PostgreSQL?


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

yo no lo hagas desea dejar la base de datos en sí, solo todas las tablas y todos los datos en ellas.


722
2017-07-24 23:24


origen


Respuestas:


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

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;

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

GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;

1027
2017-12-11 15:52



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 colocar por nombre de esquema:

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

Y luego ejecutarlo.

Glorious COPY + PASTE también funcionará.


287
2017-07-24 23:29



La respuesta más aceptada a partir de este escrito (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 virgen, esto no completa 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 de SQL", verá lo siguiente:

-- Schema: public

-- DROP SCHEMA public;

CREATE SCHEMA public
  AUTHORIZATION postgres;

Sin embargo, por el contrario, una nueva base de datos 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í, el uso de un marco web python que crea tablas de base de datos (web2py), utilizando el anterior causó problemas:

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

Entonces, en mi opinión, la respuesta 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 ejecutar estos comandos desde pgAdmin III, fui a Plugins-> PSQL Console)


217
2018-01-21 00:38



Puede soltar 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 $$;

IMO esto es mejor que drop schema public, porque no necesitas recrear el schema y restaurar todas las subvenciones.

Bono adicional que esto no requiere lenguaje de scripting externo, ni copia y pegado de SQL generado de vuelta al intérprete.


79
2018-03-15 22:21



Como Pablo arriba, para simplemente caer de un esquema específico, con respecto a la caja:

select 'drop table "' || tablename || '" cascade;' 
from pg_tables where schemaname = 'public';

62
2018-05-01 06:27



Si todo lo que quieres es colocar propiedad por el mismo usuario, entonces puedes usar:

drop owned by the_user;

Tienes que reemplazar the_user con el nombre de usuario actual, actualmente no hay ninguna opción para dejar todo para "el usuario actual". La próxima versión 9.5 tendrá la opción drop owned by current_user.

Esto también eliminará vistas materializadas, vistas, secuencias, activadores, esquemas, funciones, tipos, agregados, operadores, dominios, etc. (=todo) ese the_user posee (= creado).

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


59
2017-12-01 07:17



drop schema public cascade;

debería hacer el truco.


36
2017-10-27 21:11



Siguiendo a Pablo y LenW, aquí hay una línea que lo hace a la vez preparando y luego ejecutando:

psql -U $PGUSER $PGDB -t -c "select 'drop table \"' || tablename || '\" cascade;' from pg_tables where schemaname = 'public'" | psql -U $PGUSER $PGDB

NB: configurar o reemplazar $PGUSER y $PGDB con los valores que quieres 


24
2017-10-23 15:03



Si tiene el lenguaje de procedimiento PL / PGSQL instalado puede usar lo siguiente para eliminar todo sin un script externo shell / Perl.

DROP FUNCTION IF EXISTS remove_all();

CREATE FUNCTION remove_all() RETURNS void AS $$
DECLARE
    rec RECORD;
    cmd text;
BEGIN
    cmd := '';

    FOR rec IN SELECT
            'DROP SEQUENCE ' || quote_ident(n.nspname) || '.'
                || quote_ident(c.relname) || ' CASCADE;' AS name
        FROM
            pg_catalog.pg_class AS c
        LEFT JOIN
            pg_catalog.pg_namespace AS n
        ON
            n.oid = c.relnamespace
        WHERE
            relkind = 'S' AND
            n.nspname NOT IN ('pg_catalog', 'pg_toast') AND
            pg_catalog.pg_table_is_visible(c.oid)
    LOOP
        cmd := cmd || rec.name;
    END LOOP;

    FOR rec IN SELECT
            'DROP TABLE ' || quote_ident(n.nspname) || '.'
                || quote_ident(c.relname) || ' CASCADE;' AS name
        FROM
            pg_catalog.pg_class AS c
        LEFT JOIN
            pg_catalog.pg_namespace AS n
        ON
            n.oid = c.relnamespace WHERE relkind = 'r' AND
            n.nspname NOT IN ('pg_catalog', 'pg_toast') AND
            pg_catalog.pg_table_is_visible(c.oid)
    LOOP
        cmd := cmd || rec.name;
    END LOOP;

    FOR rec IN SELECT
            'DROP FUNCTION ' || quote_ident(ns.nspname) || '.'
                || quote_ident(proname) || '(' || oidvectortypes(proargtypes)
                || ');' AS name
        FROM
            pg_proc
        INNER JOIN
            pg_namespace ns
        ON
            (pg_proc.pronamespace = ns.oid)
        WHERE
            ns.nspname =
            'public'
        ORDER BY
            proname
    LOOP
        cmd := cmd || rec.name;
    END LOOP;

    EXECUTE cmd;
    RETURN;
END;
$$ LANGUAGE plpgsql;

SELECT remove_all();

En lugar de escribir esto en el indicador "psql", le sugiero que lo copie en un archivo y luego pase el archivo como entrada a psql usando las opciones "--file" o "-f":

psql -f clean_all_pg.sql

Crédito por el cual se debe crédito: escribí la función, pero creo que las consultas (o la primera al menos) vinieron de alguien en una de las listas de correo de pgsql hace años. No recuerdo exactamente cuándo o cuál.


18
2017-07-13 00:12