J'ai régulièrement besoin de supprimer toutes les données de ma base de données PostgreSQL avant une reconstruction. Comment faire cela directement dans SQL?
Pour le moment, j'ai réussi à créer une instruction SQL qui renvoie toutes les commandes dont j'ai besoin pour exécuter:
SELECT 'TRUNCATE TABLE ' || tablename || ';' FROM pg_tables WHERE tableowner='MYUSER';
Mais je ne vois pas un moyen de les exécuter par programme une fois que je les ai.
DECLARE r RECORD;
puis pour boucle:FOR r IN SELECT tablename FROM pg_tables LOOP
Les curseurs explicites sont rarement nécessaires dans plpgsql. Utilisez le curseur implicite plus simple et plus rapide d'une
FOR
boucle:Remarque: étant donné que les noms de table ne sont pas uniques par base de données, vous devez les qualifier de schéma pour être sûr. De plus, je limite la fonction au schéma par défaut «public». Adaptez-vous à vos besoins, mais veillez à exclure les schémas système
pg_*
etinformation_schema
.Soyez très prudent avec ces fonctions. Ils détruisent votre base de données. J'ai ajouté un dispositif de sécurité pour enfants. Commentez la
RAISE NOTICE
ligne et décommentezEXECUTE
pour amorcer la bombe ...format()
nécessite Postgres 9.1 ou version ultérieure. Dans les anciennes versions, concaténez la chaîne de requête comme ceci:Commande unique, pas de boucle
Puisque nous pouvons
TRUNCATE
plusieurs tables à la fois, nous n'avons pas du tout besoin de curseur ou de boucle:Regroupez tous les noms de table et exécutez une seule instruction. Plus simple, plus rapide:
Appel:
Requête affinée
Vous n'avez même pas besoin d'une fonction. Dans Postgres 9.0+, vous pouvez exécuter des commandes dynamiques dans une
DO
instruction. Et dans Postgres 9.5+, la syntaxe peut être encore plus simple:À propos de la différence entre
pg_class
,pg_tables
etinformation_schema.tables
:À propos
regclass
et noms de table cités:Pour usage répété
Créez une base de données "modèle" (nommons-la
my_template
) avec votre structure vanille et toutes les tables vides. Puis passez par un cycleDROP
/CREATE DATABASE
:C'est extrêmement rapide , car Postgres copie toute la structure au niveau du fichier. Aucun problème de concurrence ou autre surcharge ne vous ralentit.
Si les connexions simultanées vous empêchent de supprimer la base de données, envisagez:
la source
DROP DATABASE mydb
, évidemment). Vous confondez peut-être les schémas avec les bases de données?DO
commande (comme toute autre instruction SQL) est exécutée exclusivement dans la base de données courante . Postgres n'a aucun moyen d'accéder à d'autres bases de données dans la même transaction. Vous devrez utiliser dblink ou FDW pour ce faire. Mais il n'affecte tous les schémas de la base de données en cours - sauf si vous ajoutez à limiter l'effet à un schéma particulier dans ce cas particulier.WHERE t.schemaname = 'public'
Si je dois faire cela, je vais simplement créer un schéma sql de la base de données actuelle, puis déposer et créer la base de données, puis charger la base de données avec le schéma sql.
Voici les étapes impliquées:
1) Créer un vidage de schéma de la base de données (
--schema-only
)pg_dump mydb -s > schema.sql
2) Déposer la base de données
drop database mydb;
3) Créer une base de données
create database mydb;
4) Schéma d'importation
psql mydb < schema.sql
la source
Dans ce cas, il serait probablement préférable d'avoir simplement une base de données vide que vous utilisez comme modèle et lorsque vous devez actualiser, supprimez la base de données existante et créez-en une nouvelle à partir du modèle.
la source
Pourriez-vous utiliser le SQL dynamique pour exécuter chaque instruction à tour de rôle? Vous devrez probablement écrire un script PL / pgSQL pour ce faire.
http://www.postgresql.org/docs/8.3/static/plpgsql-statements.html (section 38.5.4. Exécution de commandes dynamiques)
la source
Vous pouvez également le faire avec bash:
Vous devrez ajuster les noms de schéma, les mots de passe et les noms d'utilisateur pour qu'ils correspondent à vos schémas.
la source
AUTO_INCREMENT
Version de nettoyage :la source
Les gars, la meilleure façon est de:
1) Créer un vidage de schéma de la base de données (--schema-only) pg_dump mydb -s> schema.sql
2) Drop database drop database mydb;
3) Créer une base de données créer une base de données mydb;
4) Importer le schéma psql mydb <schema.sql
Ça marche pour moi!
Bonne journée. Hiram Walker
la source
Si vous pouvez utiliser psql, vous pouvez utiliser la
\gexec
commande meta pour exécuter la sortie de la requête;Notez qu'il
\gexec
est introduit dans la version 9.6la source
Pour supprimer les données et conserver les structures de table dans pgAdmin, vous pouvez faire:
la source