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.

2064voto

Derek Slife Punkte 18774

Wenn sich alle Ihre Tabellen in einem einzigen Schema befinden, könnte dieser Ansatz funktionieren (der folgende Code geht davon aus, dass der Name Ihres Schemas public )

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;

Wenn Sie PostgreSQL 9.3 oder höher verwenden, müssen Sie möglicherweise auch die Standard-Grants wiederherstellen.

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

601voto

Pablo Santa Cruz Punkte 169147

Sie können eine Abfrage schreiben, um ein SQL-Skript wie dieses zu erstellen:

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

Oder:

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

Für den Fall, dass einige Tabellen aufgrund der Kaskadenoption in einem vorherigen Satz automatisch gelöscht werden.

Außerdem sollten Sie, wie in den Kommentaren erwähnt, die Tabellen, die Sie löschen möchten, nach dem Schemanamen filtern:

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

Und dann führen Sie es aus.

Das glorreiche COPY+PASTE funktioniert auch.

392voto

User Punkte 55518

Die zum Zeitpunkt der Erstellung dieses Berichts (Januar 2014) am meisten akzeptierte Antwort lautet:

drop schema public cascade;
create schema public;

Dies funktioniert zwar, aber wenn Sie das öffentliche Schema in seinen ursprünglichen Zustand zurückversetzen wollen, ist die Aufgabe damit nicht vollständig erfüllt. Wenn Sie unter pgAdmin III für PostgreSQL 9.3.1 auf das auf diese Weise erstellte "public"-Schema klicken und im "SQL-Fenster" nachsehen, sehen Sie das Folgende:

-- Schema: public

-- DROP SCHEMA public;

CREATE SCHEMA public
  AUTHORIZATION postgres;

Eine brandneue Datenbank hat dagegen folgende Merkmale:

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

Da ich ein Python-Webframework verwende, das Datenbanktabellen erstellt (web2py), verursachte die Verwendung des ersteren Probleme:

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

Meines Erachtens lautet die richtige Antwort also:

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

Beachten Sie auch, dass ich für diese Befehle in pgAdmin III das Abfragetool verwendet habe (Lupensymbol "Execute abritrary SQL queries") oder Sie können Plugins-> PSQL Console verwenden

Note

Wenn Sie Erweiterungen installiert haben, werden diese beim Löschen des Schemas gelöscht. Notieren Sie also, was Sie installieren müssen, und führen Sie dann die erforderlichen Anweisungen aus. z.B.

CREATE EXTENSION postgis;

322voto

Piotr Findeisen Punkte 16757

Sie können alle Tabellen mit

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

IMO ist dies besser als drop schema public weil Sie das Programm nicht neu erstellen müssen. schema und alle Zuschüsse wiederherstellen.

Ein zusätzlicher Bonus ist, dass dafür weder eine externe Skriptsprache noch das Kopieren und Einfügen von generiertem SQL in den Interpreter erforderlich ist.

181voto

a_horse_with_no_name Punkte 489934

Wenn alles, was Sie fallen lassen wollen Eigentum von demselben Benutzer, dann können Sie verwenden:

drop owned by the_user;

Dies wird die tout die der Benutzer besitzt.

Dazu gehören materialisierte Ansichten, Ansichten, Sequenzen, Auslöser, Schemata, Funktionen, Typen, Aggregate, Operatoren, Domänen und so weiter (also wirklich: tout ), dass the_user besitzt (=erschaffen).

Sie müssen ersetzen the_user mit dem aktuellen Benutzernamen, derzeit gibt es keine Option, alles für "den aktuellen Benutzer" zu löschen. Die kommende Version 9.5 wird die Option haben drop owned by current_user .

Weitere Einzelheiten finden Sie im Handbuch: http://www.postgresql.org/docs/current/static/sql-drop-owned.html

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