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