Comment puis-je supprimer toutes les tables dans PostgreSQL, à partir de la ligne de commande?
Je ne veux pas supprimer la base de données elle-même, juste toutes les tables et toutes les données qu'elles contiennent .
postgresql
AP257
la source
la source
public
, vous perdez toutes les extensions installées.Réponses:
Si toutes vos tables sont dans un seul schéma, cette approche pourrait fonctionner (le code ci-dessous suppose que le nom de votre schéma est
public
)Si vous utilisez PostgreSQL 9.3 ou supérieur, vous devrez peut-être également restaurer les autorisations par défaut.
la source
pg_
) comme dans un schéma différent,pg_catalog
.GRANT ALL ON SCHEMA public TO public;
après la création.GRANT ALL
après la création?Vous pouvez écrire une requête pour générer un script SQL comme celui-ci:
Ou:
Dans le cas où certaines tables sont automatiquement supprimées en raison de l'option en cascade dans une phrase précédente.
En outre, comme indiqué dans les commentaires, vous souhaiterez peut-être filtrer les tables que vous souhaitez supprimer par nom de schéma:
Et puis lancez-le.
Glorious COPY + PASTE fonctionnera également.
la source
drop schema public cascade;
, mais vous avez presque toujours les autorisations pour supprimer des tables.La réponse la plus acceptée à ce jour (janvier 2014) est:
Cela fonctionne, cependant, si votre intention est de restaurer le schéma public à son état vierge, cela n'accomplit 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 façon et regardez dans le "volet SQL", vous verrez ce qui suit:
Cependant, en revanche, une nouvelle base de données aura les éléments suivants:
Pour moi, en utilisant un framework web python qui crée des tables de base de données (web2py), en utilisant les premiers problèmes causés:
Donc, à mon avis, la réponse entièrement correcte est:
Notez également que pour émettre ces commandes dans pgAdmin III, j'ai utilisé l'outil de requête (icône de la loupe "Exécuter des requêtes SQL abritairs") ou vous pouvez utiliser des plugins-> PSQL Console
Remarque
Si des extensions sont installées, elles seront supprimées lorsque vous supprimerez le schéma, vous devez donc prendre note de ce que vous devez installer, puis exécuter des instructions si nécessaire. Par exemple
CREATE EXTENSION postgis;
la source
drop
alorscreate
) sur PostgreSQL 9.1. Après la mise à niveau vers 9.3, les deux supplémentairesgrant
sont nécessaires.Vous pouvez supprimer toutes les tables avec
OMI, c'est mieux que
drop schema public
, car vous n'avez pas besoin de recréer leschema
et de restaurer toutes les subventions.Bonus supplémentaire qui ne nécessite pas de langage de script externe, ni de copier-coller du SQL généré vers l'interpréteur.
la source
drop schema
astuce car l'utilisateur n'était pas propriétaire du schéma, seulement des tables. Celui-ci a bien fonctionné :)EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
avec ceci:EXECUTE format('DROP TABLE IF EXISTS %I CASCADE', quote_ident(r.tablename));
Si tout ce que vous souhaitez supprimer appartient au même utilisateur, vous pouvez utiliser:
Cela supprimera tout ce que l'utilisateur possède.
Cela inclut les vues matérialisées, les vues, les séquences, les déclencheurs, les schémas, les fonctions, les types, les agrégats, les opérateurs, les domaines, etc. (donc, vraiment: tout ) qui
the_user
appartient (= créé).Vous devez remplacer
the_user
par le nom d'utilisateur réel, actuellement il n'y a pas d'option pour tout supprimer pour "l'utilisateur actuel". La prochaine version 9.5 aura l'optiondrop owned by current_user
.Plus de détails dans le manuel: http://www.postgresql.org/docs/current/static/sql-drop-OWN.html
la source
public
schéma appartiennent àpostgres
, mais tout le reste appartient à un utilisateur spécifique, donc supprimer tout ce qui appartient à cet utilisateur efface la base de données à l' exception du schéma.Comme par Pablo ci-dessus, pour simplement passer d'un schéma spécifique, par rapport à la casse:
la source
where schemaname='public'
pièce est importante?devrait faire l'affaire.
la source
CREATE SCHEMA public;
. Voir également stackoverflow.com/a/14286370 pour plus d'informationsAprè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: définissez ou remplacez
$PGUSER
et$PGDB
avec les valeurs que vous souhaitezla source
Si le langage procédural PL / PGSQL est installé, vous pouvez utiliser ce qui suit pour tout supprimer sans script externe shell / Perl.
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":
Crédit à qui le crédit est dû: j'ai écrit la fonction, mais je pense que les requêtes (ou la première au moins) sont venues de quelqu'un sur l'une des listes de diffusion pgsql il y a des années. Je ne me souviens pas exactement quand ni lequel.
la source
Si vous souhaitez de toute façon supprimer toutes les tables, vous pouvez vous passer de subtilités telles que CASCADE en mettant toutes les tables dans une seule instruction. Cela rend également l'exécution plus rapide.
L'exécuter directement:
Remplacez
TRUNCATE
parDROP
le cas échéant.la source
public
schéma, n'oubliez pas d'inclure le nom du schéma dans l'expression:string_agg(quote_ident(schemaname) || '.' || quote_ident(tablename), ', ')
au lieu de simplement passer les noms de table.J'ai légèrement modifié la réponse de Pablo pour la commodité d'avoir les commandes SQL générées renvoyées en une seule chaîne:
la source
Utilisez ce script dans pgAdmin:
la source
Juste au cas où ... Script Python simple qui nettoie la base de données Postgresql
Assurez-vous qu'après l'avoir copié, l'indentation est correcte car Python s'appuie dessus.
la source
Vous pouvez utiliser la fonction string_agg pour créer une liste séparée par des virgules, parfaite pour DROP TABLE. À partir d'un script bash:
la source
C'est une question vraiment intéressante, et vous y arriverez de plusieurs manières. J'espère que cela vous sera utile.
Ici, en général, nous avons un
public
schéma par défaut. Donc, je l'utilise comme instance.Si vous utilisez PostgreSQL 9.3 ou supérieur, vous devrez peut-être également restaurer les autorisations par défaut.
Cela nettoiera tout un schéma et le recréera comme un nouveau.
Vous perdrez d' autres entités aussi comme
Functions
,Views
,Materialized views
, etc.PostgreSQL stocke toutes les tables sur sa table d'enregistrement nommée
pg_table
.Comme vous pouvez le voir, en utilisant la sous-requête, nous pouvons supprimer l'intégralité des tables du schéma.
Lorsque les autres entités de données sont importantes et que vous souhaitez simplement supprimer uniquement les tables du schéma, cette approche vous sera vraiment utile.
la source
Si vous souhaitez supprimer des données (pas supprimer la table):
Ou si vous voulez déposer une table, vous pouvez utiliser ce sql:
la source
Remarque: ma réponse consiste à supprimer réellement les tables et autres objets de base de données; pour la suppression de toutes les données dans les tableaux, à savoir tronquer toutes les tables , Endre deux a fourni une déclaration (exécution directe) Similairement bien exécuté un mois plus tard.
Pour les cas où vous ne pouvez pas simplement
DROP SCHEMA public CASCADE;
,DROP OWNED BY current_user;
ou quelque chose comme ça, voici un script SQL autonome que j'ai écrit, qui est sûr pour les transactions (c'est-à-dire que vous pouvez le mettre entreBEGIN;
et soit leROLLBACK;
tester simplement, soitCOMMIT;
faire l'acte) et nettoie «tous» les objets de la base de données… enfin, tous ceux utilisés dans la base de données que notre application utilise ou je pourrais raisonnablement ajouter, ce qui est:CHECK
,UNIQUE
)VIEW
s (normal ou matérialisé)public
ou internes à la base de données) «que nous» possédons: le script est utile lorsqu'il est exécuté en tant que «pas un superutilisateur de base de données»; un superutilisateur peut tout laisser tomber schémas (les plus importants sont cependant explicitement exclus)Non abandonnés sont (certains délibérés; certains uniquement parce que je n'avais aucun exemple dans notre DB):
public
schéma (par exemple pour les éléments fournis par l'extension)Ceci est vraiment utile dans les cas où le vidage que vous souhaitez restaurer est d'une version de schéma de base de données différente (par exemple avec Debian
dbconfig-common
, Flyway ou Liquibase / DB-Manul) que la base de données dans laquelle vous souhaitez le restaurer.J'ai également une version qui supprime «tout sauf deux tables et ce qui leur appartient» (une séquence, testée manuellement, désolé, je sais, ennuyeuse) au cas où quelqu'un serait intéressé; le diff est petit. Contactez-moi ou consultez ce repo si vous intéressé.
SQL
Testé, sauf ajouts ultérieurs (
extensions
contribution de Clément Prévost ), sur PostgreSQL 9.6 (jessie-backports
). Suppression d'agrégats testée sur 9.6 et 12.2, retrait de procédure également testé sur 12.2. Les corrections de bugs et autres améliorations sont les bienvenues!la source
DROP FUNCTION
échoue pour une procédure, et vice versa. J'ai modifié la section de fonction à ceci:AND pp.prokind ='f' -- Function
ouAND pp.prokind ='p' -- Procedure
proisagg
) sur ≤ 10.x et les agrégats et les procédures (prokind
) sur ≥ 11 (vérifié dynamiquement) et j'ai testé les deux ☻ merci pour l'astuce.Vous devez supprimer des tableaux et des séquences, voici ce qui a fonctionné pour moi
avant d'exécuter la commande que vous pourriez avoir besoin de Sudo / su à l'
postgres
utilisateur ou (détails connexion à l'exportationPGHOST
,PGPORT
,PGUSER
etPGPASSWORD
) puisexport PGDATABASE=yourdatabase
la source
Rake task for Rails for destroy all tables in current database
la source
rake db:create
, je l'exécute. Vous pouvez faire l'astuce de Steve et supprimer le codetable_name =
et changer", "
pour","
et#{ tables }
fo#{tables}
Les étapes suivantes peuvent être utiles (pour les utilisateurs de Linux):
Entrez d'abord l'
postgres
invite de commande en suivant la commande:Entrez la base de données par cette commande (mon nom de base de données est:)
maoss
:Entrez maintenant la commande pour supprimer toutes les tables:
la source
J'ai amélioré la méthode bash de jamie en prenant soin des vues car la sienne ne respecte que le type de table "table de base" qui est la valeur par défaut.
le code bash suivant supprime d'abord les vues, puis tout le reste
la source
psql -d $PGDB -t --command "SELECT string_agg(sequence_name, ',') FROM information_schema.sequences WHERE sequence_schema='public' AND sequence_catalog='$PGDB'"
dans un fichier batch Windows:
la source
bien, puisque j'aime travailler depuis la ligne de commande ...
psql -U <user> -d <mydb> -c '\dt' | cut -d ' ' -f 4 | sed -e "s/^/drop table if exists /" | sed -e "s/$/;/"
-c '\dt'
invoquera la commande list tables.List of relations Schema | Name | Type | Owner --------+-------------------+-------+---------- public | _d_psidxddlparm | table | djuser public | _d_psindexdefn | table | djuser
cut -d ' ' -f 4
maintenant, dirigez sa sortie pour saisir le 4ème champ (lorsque vous utilisez l'espace comme séparateur), qui est la table.sed
est ensuite utilisé pour préfixer adrop table
et suffixer le;
séparateur de commandes.| egrep '_d_'
- Ajoutez-engrep
plus et vous pouvez être plus sélectif sur les tables que vous supprimez.drop table if exists _d_psidxddlparm; drop table if exists _d_psindexdefn;
Remarque: tel qu'écrit, cela générera de fausses lignes pour la
\dt
sortie des commandes des en-têtes de colonne et le total des lignes à la fin. J'évite cela en applaudissant, mais vous pouvez utiliserhead
ettail
.la source
Le moyen le plus simple consiste à supprimer le schéma public comme d'autres l'ont suggéré dans les réponses précédentes. Cependant, ce n'est PAS un bon moyen. Vous ne savez jamais ce qui a été fait au schéma public qui a depuis été oublié et n'a pas été documenté. Vous ne savez pas non plus si cela fonctionnera de la même manière à l'avenir. Dans la version 9, cela aurait été bien, mais dans la version 10, tous vos utilisateurs perdraient l'accès au schéma et ils devraient à nouveau y accéder, sinon votre application se briserait. Je n'ai pas vérifié la V11, mais le fait est que vous ne savez jamais ce qui se cassera lorsque vous passez d'une machine à l'autre, d'un site à l'autre ou d'une version à une autre. Cela ne peut pas non plus être fait si vous êtes un utilisateur qui a accès à la base de données, mais pas au schéma.
Si vous devez le faire par programme, les autres réponses ci-dessus couvrent cela, mais une chose que les réponses ci-dessus ne prennent pas en compte est de demander à Postgres de faire le travail pour vous. Si vous utilisez pg_dump avec l'option -c comme ci-dessous:
Cela créera un script de restauration de base de données avec des instructions sql qui supprimera toutes les tables.
Si le seul but en posant la question était de supprimer les tables avant la restauration, votre restauration fera le travail pour vous.
Cependant, si vous en avez besoin pour autre chose, vous pouvez simplement copier les instructions drop du script sql.
la source