1
votes

Supprimer les données (mais pas la structure) d'une base de données Postgres avec une requête SQL?

J'utilise le client Postico qui me permet d'écrire des requêtes SQL pour ma base de données Postgres. Je n'ai pas accès au terminal.

Pendant le développement, je dois fréquemment effacer toutes les données, ce qui prend du temps. Y a-t-il une commande qui peut faire cela?

J'ai essayé ceci mais j'obtiens une erreur de syntaxe:

SELECT table_name
  FROM information_schema.tables
 WHERE table_schema='public'
   AND table_type='BASE TABLE';

J'ai également essayé DELETE FROM tbl; et TRUNCATE TABLE;

MISE À JOUR: Si j'exécute cette commande:

DELETE FROM *
WHERE *

Ensuite, j'ai environ 30 tables, donc devoir exécuter une commande 30 fois prend encore beaucoup de temps.


0 commentaires

3 Réponses :


0
votes

La syntaxe est incorrecte. Vous devrez exécuter:

TRUNCATE tablename;

La troncature est plus rapide car elle supprime immédiatement toutes les données de la table. La syntaxe pour cela est:

DELETE FROM tablename
WHERE columnname = 'value';


1 commentaires

J'ai mis à jour ma question. J'ai environ 30 tables, donc avoir à la commande 30 fois prendra beaucoup de temps. Y a-t-il une seule commande qui fonctionnerait?



0
votes

Il n'y a pas de commande unique pour cela, vous devrez écrire un script qui TRUNCATE toutes les tables dans le bon ordre (et n'oubliez pas de réinitialiser les séquences).

Une alternative est de créer un tel script avec pg_dump :

pg_dump -s --clean -f script.sql dbname

Ce script supprimera et recréera tous les objets.


0 commentaires

0
votes

Vous pouvez générer une seule instruction TRUNCATE:

do
$$
declare
  l_sql text;
begin
  SELECT 'truncate table '
            ||string_agg(format('%I.%I', table_schema, table_name), ',')
            ||' cascade restart identity'
     into l_sql
  FROM information_schema.tables
  WHERE table_schema='public'
    AND table_type='BASE TABLE';

  execute l_sql;
end;
$$
;

Ensuite, copiez et collez simplement l'instruction générée pour l'exécuter.


Vous pouvez également utiliser un bloc DO qui utilise du SQL dynamique pour exécuter l'instruction TRUNCATE:

SELECT 'truncate table '||
          string_agg(format('%I.%I', table_schema, table_name), ',')||
          ' cascade restart identity;'
FROM information_schema.tables
WHERE table_schema='public'
  AND table_type='BASE TABLE';

En tronquant toutes les tables en une seule instruction, vous n'avez pas à vous soucier de l'ordre de les tronquer.

Notez que si vous avez de nombreuses tables, vous devrez peut-être augmenter max_locks_per_transaction pour que cela fonctionne.


0 commentaires