1657 Stimmen

Wie kann ich alle Tabellen in einer PostgreSQL-Datenbank löschen?

Wie kann ich alle Tabellen in PostgreSQL über die Kommandozeile löschen?

I nicht die Datenbank selbst löschen möchten, nur alle Tabellen und alle darin enthaltenen Daten.

25voto

Mark Lawrence Punkte 331

Wenn Sie die prozedurale Sprache PL/PGSQL verwenden installiert können Sie wie folgt vorgehen, um alles ohne ein externes Shell/Perl-Skript zu entfernen.

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();

Anstatt dies an der "psql"-Eingabeaufforderung einzugeben, würde ich vorschlagen, dass Sie es in eine Datei kopieren und die Datei dann mit den Optionen "--file" oder "-f" als Eingabe an psql übergeben:

psql -f clean_all_pg.sql

Ehre, wem Ehre gebührt: Ich habe die Funktion geschrieben, aber ich glaube, die Abfragen (oder zumindest die erste) stammen von jemandem aus einer der pgsql-Mailinglisten vor Jahren. Ich weiß nicht mehr genau, wann oder auf welcher.

22voto

Endre Both Punkte 5120

Wenn Sie ohnehin alle Tabellen vernichten wollen, können Sie auf Feinheiten wie CASCADE verzichten, indem Sie alle Tabellen in eine einzige Anweisung packen. Das macht die Ausführung auch schneller.

SELECT 'TRUNCATE TABLE ' || string_agg('"' || tablename || '"', ', ') || ';' 
FROM pg_tables WHERE schemaname = 'public';

Direktes Ausführen:

DO $$
DECLARE tablenames text;
BEGIN    
    tablenames := string_agg('"' || tablename || '"', ', ') 
        FROM pg_tables WHERE schemaname = 'public';
    EXECUTE 'TRUNCATE TABLE ' || tablenames;
END; $$

Ersetzen Sie TRUNCATE con DROP wie zutreffend.

17voto

Adé Punkte 395

Ich habe die Antwort von Pablo leicht abgeändert, damit die generierten SQL-Befehle als eine einzige Zeichenkette zurückgegeben werden:

select string_agg('drop table "' || tablename || '" cascade', '; ') 
from pg_tables where schemaname = 'public'

16voto

Piotr Kochański Punkte 20846

Nur für den Fall... Einfaches Python-Skript, das die Postgresql-Datenbank bereinigt

import psycopg2
import sys

# Drop all tables from a given database

try:
    conn = psycopg2.connect("dbname='akcja_miasto' user='postgres' password='postgres'")
    conn.set_isolation_level(0)
except:
    print "Unable to connect to the database."

cur = conn.cursor()

try:
    cur.execute("SELECT table_schema,table_name FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_schema,table_name")
    rows = cur.fetchall()
    for row in rows:
        print "dropping table: ", row[1]   
        cur.execute("drop table " + row[1] + " cascade") 
    cur.close()
    conn.close()        
except:
    print "Error: ", sys.exc_info()[1]

Stellen Sie sicher, dass die Einrückung nach dem Kopieren richtig ist, da Python sich darauf verlässt.

16voto

Luca Perico Punkte 1125

Verwenden Sie dieses Skript in pgAdmin:

DO $$
DECLARE 
    brow record;
BEGIN
    FOR brow IN (select 'drop table "' || tablename || '" cascade;' as table_name from pg_tables where schemaname = 'public') LOOP
        EXECUTE brow.table_name;
    END LOOP;
END; $$

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X