Wie kann ich alle Tabellen in PostgreSQL über die Befehlszeile löschen?
Ich möchte nicht die Datenbank selbst löschen, sondern nur alle Tabellen und alle darin enthaltenen Daten.
postgresql
AP257
quelle
quelle
public
, verlieren Sie alle installierten Erweiterungen.Antworten:
Wenn sich alle Ihre Tabellen in einem einzigen Schema befinden, könnte dieser Ansatz funktionieren (im folgenden Code wird davon ausgegangen, dass der Name Ihres Schemas lautet
public
).Wenn Sie PostgreSQL 9.3 oder höher verwenden, müssen Sie möglicherweise auch die Standardzuschüsse wiederherstellen.
quelle
pg_
) nicht entfernt werden, da sie sich in einem anderen Schema befindenpg_catalog
.GRANT ALL ON SCHEMA public TO public;
nach dem Erstellen haben möchten .GRANT ALL
nach dem Erstellen?Sie können eine Abfrage schreiben, um ein SQL-Skript wie folgt zu generieren:
Oder:
Falls einige Tabellen aufgrund der Kaskadenoption in einem vorherigen Satz automatisch gelöscht werden.
Wie in den Kommentaren angegeben, möchten Sie die Tabellen, die Sie löschen möchten, möglicherweise nach Schemanamen filtern:
Und dann lass es laufen.
Glorious COPY + PASTE wird auch funktionieren.
quelle
drop schema public cascade;
hast, aber du hast fast immer die Berechtigung, Tabellen zu löschen .Die am meisten akzeptierte Antwort zum Zeitpunkt dieses Schreibens (Januar 2014) lautet:
Dies funktioniert jedoch. Wenn Sie jedoch beabsichtigen, das öffentliche Schema in seinen ursprünglichen Zustand zurückzusetzen, wird die Aufgabe nicht vollständig ausgeführt. Wenn Sie unter pgAdmin III für PostgreSQL 9.3.1 auf das so erstellte "öffentliche" Schema klicken und im "SQL-Bereich" nachsehen, wird Folgendes angezeigt:
Im Gegensatz dazu wird eine brandneue Datenbank jedoch Folgendes enthalten:
Für mich verursachte die Verwendung eines Python-Webframeworks, das Datenbanktabellen (web2py) erstellt, wobei das erstere Probleme verursachte:
Meiner Meinung nach lautet die völlig richtige Antwort:
Um diese Befehle auch in pgAdmin III auszugeben, habe ich das Abfrage-Tool (Lupensymbol "Abritrary SQL-Abfragen ausführen") verwendet, oder Sie können Plugins-> PSQL Console verwenden
Hinweis
Wenn Sie Erweiterungen installiert haben, werden diese beim Löschen des Schemas gelöscht. Notieren Sie sich daher, was installiert werden muss, und führen Sie die erforderlichen Anweisungen aus. Z.B
CREATE EXTENSION postgis;
quelle
drop
damalscreate
) für PostgreSQL 9.1. Nach dem Upgrade auf 9.3 sind die beiden zusätzlichengrant
erforderlich.Sie können alle Tabellen mit löschen
IMO ist dies besser als
drop schema public
, weil Sie nichtschema
alle Zuschüsse neu erstellen und wiederherstellen müssen.Zusätzlicher Bonus, dass dies keine externe Skriptsprache oder das Kopieren von generiertem SQL zurück in den Interpreter erfordert.
quelle
drop schema
Trick nicht anwenden, da der Benutzer nicht Eigentümer des Schemas war, sondern nur der Tabellen. Dieser hat aber funktioniert :)EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
:EXECUTE format('DROP TABLE IF EXISTS %I CASCADE', quote_ident(r.tablename));
Wenn alles , was Sie wollen Drop ist im Besitz von demselben Benutzer, dann können Sie:
Dadurch wird alles gelöscht, was der Benutzer besitzt.
Dazu gehören materialisierte Ansichten, Ansichten, Sequenzen, Trigger, Schemata, Funktionen, Typen, Aggregate, Operatoren, Domänen usw. (also wirklich: alles ), die
the_user
besitzen (= erstellt).Sie müssen durch
the_user
den tatsächlichen Benutzernamen ersetzen. Derzeit gibt es keine Möglichkeit, alles für "den aktuellen Benutzer" zu löschen. Die kommende 9.5-Version wird die Option habendrop owned by current_user
.Weitere Details im Handbuch: http://www.postgresql.org/docs/current/static/sql-drop-owed.html
quelle
public
Schema gehörenpostgres
, aber alles andere gehört einem bestimmten Benutzer. Wenn Sie also alles löschen, was diesem Benutzer gehört, wird die Datenbank mit Ausnahme des Schemas gelöscht.Wie oben in Pablo beschrieben, um in Bezug auf den Fall einfach von einem bestimmten Schema abzuweichen:
quelle
where schemaname='public'
Teil ist bedeutend?sollte den Trick machen.
quelle
CREATE SCHEMA public;
. Siehe auch stackoverflow.com/a/14286370 für weitere InformationenNach Pablo und LenW gibt es hier einen Einzeiler, der alles vorbereitet und dann ausführt:
psql -U $PGUSER $PGDB -t -c "select 'drop table \"' || tablename || '\" cascade;' from pg_tables where schemaname = 'public'" | psql -U $PGUSER $PGDB
NB: entweder setzen oder ersetzen
$PGUSER
und$PGDB
mit den gewünschten Wertenquelle
Wenn Sie die prozedurale Sprache PL / PGSQL installiert haben , können Sie Folgendes verwenden, um alles ohne ein externes Shell / Perl-Skript zu entfernen.
Anstatt dies an der Eingabeaufforderung "psql" einzugeben, würde ich vorschlagen, dass Sie es in eine Datei kopieren und die Datei dann als Eingabe an psql mit den Optionen "--file" oder "-f" übergeben:
Gutschrift, wo Gutschrift fällig ist: Ich habe die Funktion geschrieben, aber ich denke, die Anfragen (oder zumindest die erste) kamen von jemandem, der vor Jahren auf einer der pgsql-Mailinglisten stand. Ich erinnere mich nicht genau, wann oder welche.
quelle
Wenn Sie trotzdem alle Tabellen nuklearisieren möchten, können Sie auf Feinheiten wie CASCADE verzichten, indem Sie alle Tabellen in einer einzigen Anweisung zusammenfassen. Dies beschleunigt auch die Ausführung.
Direkt ausführen:
Bei Bedarf
TRUNCATE
durch ersetzenDROP
.quelle
public
Schema nicht bearbeiten, vergessen Sie nicht, den Schemanamen in den Ausdruck aufzunehmen:string_agg(quote_ident(schemaname) || '.' || quote_ident(tablename), ', ')
anstatt nur die Tabellennamen zu übergeben.Ich habe Pablos Antwort leicht geändert, um die generierten SQL-Befehle als eine einzige Zeichenfolge zurückzugeben:
quelle
Verwenden Sie dieses Skript in pgAdmin:
quelle
Nur für den Fall ... Einfaches Python-Skript, das die Postgresql-Datenbank bereinigt
Stellen Sie sicher, dass der Einzug nach dem Kopieren richtig ist, da Python darauf angewiesen ist.
quelle
Mit der Funktion string_agg können Sie eine durch Kommas getrennte Liste erstellen, die sich perfekt für DROP TABLE eignet. Aus einem Bash-Skript:
quelle
Wenn Sie Daten löschen möchten (keine Tabelle löschen):
Oder wenn Sie eine Drop-Tabelle möchten, können Sie diese SQL verwenden:
quelle
Hinweis: In meiner Antwort geht es darum, die Tabellen und andere Datenbankobjekte wirklich zu löschen. zum Löschen aller Daten in den Tabellen, dh Abschneiden aller Tabellen , hat Endre Both einen Monat später eine ähnlich gut ausgeführte Anweisung (direkte Ausführung) bereitgestellt.
Für die Fälle , in denen Sie nicht können
DROP SCHEMA public CASCADE;
,DROP OWNED BY current_user;
oder etwas, hier ist ein Stand-alone - SQL - Skript schrieb ich, die transaktionssicher ist (dh Sie es zwischen setzen könnenBEGIN;
und entwederROLLBACK;
nur testen Sie es aus oderCOMMIT;
tatsächlich zu tun , die Tat) und Bereinigt "alle" Datenbankobjekte ... nun, alle, die in der Datenbank verwendet werden, die unsere Anwendung verwendet, oder ich könnte vernünftigerweise hinzufügen, nämlich:CHECK
,UNIQUE
)VIEW
s (normal oder materialisiert)public
oder DB-internen) Schemata, die „wir“ besitzen: Das Skript ist nützlich, wenn es als „kein Datenbank-Superuser“ ausgeführt wird. Ein Superuser kann alle Schemata löschen (die wirklich wichtigen sind jedoch immer noch ausdrücklich ausgeschlossen).Nicht fallen gelassen werden (einige absichtlich; einige nur, weil ich kein Beispiel in unserer DB hatte):
public
Schema (z. B. für von Erweiterungen bereitgestellte Inhalte)Dies ist sehr nützlich für Fälle, in denen der Dump, den Sie wiederherstellen möchten, eine andere Datenbankschemaversion aufweist (z. B. mit Debian)
dbconfig-common
, Flyway oder Liquibase / DB-Manul) als die Datenbank, in der Sie ihn wiederherstellen möchten.Ich habe auch eine Version, die "alles außer zwei Tabellen und was dazu gehört" löscht (eine Sequenz, manuell getestet, sorry, ich weiß, langweilig), falls jemand interessiert ist; Der Unterschied ist klein. Kontaktieren Sie mich oder überprüfen Sie dieses Repo bei Interesse.
SQL
Getestet, mit Ausnahme späterer Ergänzungen (
extensions
beigesteuert von Clément Prévost ), auf PostgreSQL 9.6 (jessie-backports
). Die Aggregatentfernung wurde unter 9.6 und 12.2 getestet, die Verfahrensentfernung ebenfalls unter 12.2. Bugfixes und weitere Verbesserungen sind willkommen!quelle
DROP FUNCTION
einer Prozedur und umgekehrt. Ich habe den Funktionsabschnitt folgendermaßen geändert:AND pp.prokind ='f' -- Function
oderAND pp.prokind ='p' -- Procedure
proisagg
) auf ≤ 10.x und Aggregate und Prozeduren (prokind
) auf ≥ 11 (dynamisch überprüft) zu behandeln, und beide getestet ☻ danke für den Hinweis.Dies ist eine wirklich interessante Frage, die Sie auf mehrere Arten erledigen können. Ich hoffe, das wird Ihnen nützlich sein.
Hier haben wir im Allgemeinen
public
standardmäßig ein Schema. Also benutze ich es als Instanz.Wenn Sie PostgreSQL 9.3 oder höher verwenden, müssen Sie möglicherweise auch die Standardzuschüsse wiederherstellen.
Dadurch wird ein gesamtes Schema bereinigt und als neues Schema neu erstellt.
Sie werden andere Einheiten verlieren auch wie
Functions
,Views
,Materialized views
usw.PostgreSQL speichert alle Tabellen in seiner Datensatztabelle mit dem Namen
pg_table
.Wie Sie sehen können, können wir mithilfe von Unterabfragen die gesamten Tabellen aus dem Schema entfernen.
Wenn die anderen Datenentitäten wichtig sind und Sie nur Tabellen aus dem Schema löschen möchten, ist dieser Ansatz für Sie sehr hilfreich.
quelle
Sie müssen Tabellen und Sequenzen löschen, hier ist, was für mich funktioniert hat
bevor Sie den Befehl ausführen müssen Sie sudo / su den
postgres
Benutzer oder (Export AnschlussdetailsPGHOST
,PGPORT
,PGUSER
undPGPASSWORD
) und dannexport PGDATABASE=yourdatabase
quelle
Rake-Task für Rails zum Zerstören aller Tabellen in der aktuellen Datenbank
quelle
rake db:create
ich es danach. Sie können den Steve-Tipp machen und den Code entfernentable_name =
und", "
für","
und#{ tables }
für#{tables}
Die folgenden Schritte können hilfreich sein (für Linux-Benutzer):
Geben Sie zunächst die
postgres
Eingabeaufforderung mit folgendem Befehl ein:Geben Sie die Datenbank mit diesem Befehl ein (mein Datenbankname ist :)
maoss
:Geben Sie nun den Befehl zum Löschen aller Tabellen ein:
quelle
Ich habe die Bash-Methode von Jamie erweitert, indem ich mich um Ansichten gekümmert habe, da er nur den Tabellentyp "Basistabelle" berücksichtigt, der die Standardeinstellung ist.
Der folgende Bash-Code löscht zuerst die Ansichten und dann den Rest
quelle
psql -d $PGDB -t --command "SELECT string_agg(sequence_name, ',') FROM information_schema.sequences WHERE sequence_schema='public' AND sequence_catalog='$PGDB'"
in einer Windows-Batchdatei:
quelle
Nun, da ich gerne von der Kommandozeile aus arbeite ...
psql -U <user> -d <mydb> -c '\dt' | cut -d ' ' -f 4 | sed -e "s/^/drop table if exists /" | sed -e "s/$/;/"
-c '\dt'
ruft den Befehl list tables auf.List of relations Schema | Name | Type | Owner --------+-------------------+-------+---------- public | _d_psidxddlparm | table | djuser public | _d_psindexdefn | table | djuser
cut -d ' ' -f 4
Leiten Sie nun die Ausgabe weiter, um das 4. Feld (bei Verwendung von Leerzeichen als Trennzeichen) zu erfassen, bei dem es sich um die Tabelle handelt.sed
wird dann verwendet, umdrop table
dem;
Befehlstrennzeichen ein Präfix und ein Suffix hinzuzufügen.| egrep '_d_'
- Pipe es ingrep
etwas mehr und Sie können selektiver sein, welche Tabellen Sie fallen lassen.drop table if exists _d_psidxddlparm; drop table if exists _d_psindexdefn;
Hinweis: Wie geschrieben, werden dadurch falsche Zeilen für die
\dt
Befehlsausgabe von Spaltenüberschriften und Gesamtzeilen am Ende generiert . Ich vermeide das durch Greppen, aber du könntesthead
und verwendentail
.quelle
Am einfachsten ist es, das öffentliche Schema zu löschen, wie andere in früheren Antworten vorgeschlagen haben. Dies ist jedoch kein guter Weg. Sie wissen nie, was mit dem öffentlichen Schema geschehen ist, das inzwischen vergessen und nicht dokumentiert wurde. Sie wissen auch nicht, ob dies in Zukunft genauso funktionieren wird. In V9 wäre es in Ordnung gewesen, aber in V10 würden alle Benutzer den Zugriff auf das Schema verlieren und müssen erneut Zugriff erhalten, sonst wird Ihre Anwendung beschädigt. Ich habe V11 nicht überprüft, aber der Punkt ist, dass Sie nie wissen, was beim Wechsel von Maschine zu Maschine, Site zu Site oder Version zu Version kaputt geht. Dies ist auch nicht möglich, wenn Sie ein Benutzer sind, der Zugriff auf die Datenbank hat, jedoch nicht auf das Schema.
Wenn Sie dies programmgesteuert tun müssen, decken andere Antworten dies ab, aber eine Sache, die die obigen Antworten nicht berücksichtigen, ist, Postgres zu veranlassen, die Arbeit für Sie zu erledigen. Wenn Sie pg_dump mit der folgenden Option -c verwenden:
Dadurch wird ein DB-Wiederherstellungsskript mit SQL-Anweisungen erstellt, mit dem alle Tabellen gelöscht werden.
Wenn der einzige Zweck beim Stellen der Frage darin bestand, die Tabellen vor der Wiederherstellung zu löschen, erledigt Ihre Wiederherstellung die Arbeit für Sie.
Wenn Sie es jedoch für etwas anderes benötigen, können Sie die drop-Anweisungen einfach aus dem SQL-Skript kopieren.
quelle