Question Supprimer toutes les tables dans PostgreSQL?


Comment puis-je supprimer toutes les tables dans PostgreSQL, à partir de la ligne de commande?

je ne pas vouloir supprimer la base de données elle-même, juste toutes les tables et toutes les données qui s'y trouvent.


722
2017-07-24 23:24


origine


Réponses:


Si toutes vos tables sont dans un schéma unique, cette approche peut fonctionner (sous le code suppose que le nom de votre schéma est public)

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;

Si vous utilisez PostgreSQL 9.3 ou supérieur, vous devrez peut-être également restaurer les autorisations par défaut.

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

1027
2017-12-11 15:52



Vous pouvez écrire une requête pour générer un script SQL comme ceci:

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

Ou:

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

Dans le cas où certaines tables sont automatiquement supprimées en raison de l'option cascade dans une phrase précédente.

En outre, comme indiqué dans les commentaires, vous pouvez filtrer les tables que vous souhaitez supprimer par nom de schéma:

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

Et puis exécutez-le.

Glorious COPY + PASTE fonctionnera également.


287
2017-07-24 23:29



La réponse la plus acceptée à ce jour (janvier 2014) est:

drop schema public cascade;
create schema public;

Cela fonctionne, cependant si votre intention est de restaurer le schéma public à son état vierge, cela n'effectue pas entièrement la tâche. Sous pgAdmin III pour PostgreSQL 9.3.1, si vous cliquez sur le schéma "public" créé de cette manière et regardez dans le "volet SQL", vous verrez ce qui suit:

-- Schema: public

-- DROP SCHEMA public;

CREATE SCHEMA public
  AUTHORIZATION postgres;

Cependant, en revanche, une nouvelle base de données aura les éléments suivants:

-- 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';

Pour moi en utilisant un framework web python qui crée des tables de base de données (web2py), l'utilisation de l'ancien a causé des problèmes:

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

Donc, à mon avis, la réponse tout à fait correcte est:

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';

(notez également pour émettre ces commandes à partir de pgAdmin III, je suis allé à Plugins-> PSQL Console)


217
2018-01-21 00:38



Vous pouvez supprimer toutes les tables avec

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

OMI c'est mieux que drop schema public, parce que vous n'avez pas besoin de recréer schema et restaurer toutes les subventions.

Bonus supplémentaire que cela ne nécessite pas de langage de script externe, ni copier-coller de SQL généré à l'interpréteur.


79
2018-03-15 22:21



Selon Pablo ci-dessus, pour simplement tomber d'un schéma spécifique, par rapport à l'affaire:

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

62
2018-05-01 06:27



Si tout ce que vous voulez laisser tomber est détenue par le même utilisateur, vous pouvez utiliser:

drop owned by the_user;

Vous devez remplacer the_user avec le nom d'utilisateur actuel, il n'y a actuellement aucune option pour tout laisser tomber pour "l'utilisateur actuel". La prochaine version 9.5 aura l'option drop owned by current_user.

Cela permet également de supprimer les vues, vues, séquences, déclencheurs, schémas, fonctions, types, agrégats, opérateurs, domaines, etc. matérialisés (=tout) cette the_user possède (= créé).

Plus de détails dans le manuel: http://www.postgresql.org/docs/current/static/sql-drop-owned.html


59
2017-12-01 07:17



drop schema public cascade;

devrait faire l'affaire.


36
2017-10-27 21:11



Après Pablo et LenW, voici un one-liner qui fait tout à la fois la préparation et l'exécution:

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

NB: soit définir ou remplacer $PGUSER et $PGDB avec les valeurs que vous voulez 


24
2017-10-23 15:03



Si vous avez le langage procédural PL / PGSQL installée vous pouvez utiliser ce qui suit pour tout supprimer sans script externe 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();

Plutôt que de taper ceci à l'invite "psql", je vous suggère de le copier dans un fichier, puis de passer le fichier en entrée à psql en utilisant les options "--file" ou "-f":

psql -f clean_all_pg.sql

Crédit où le crédit est dû: J'ai écrit la fonction, mais pense que les requêtes (ou la première au moins) provenaient de quelqu'un sur l'une des listes de diffusion pgsql il y a des années. Je ne me souviens pas exactement quand ou lequel.


18
2017-07-13 00:12