Ich muss vor einer Neuerstellung regelmäßig alle Daten aus meiner PostgreSQL-Datenbank löschen. Wie würde ich das direkt in SQL machen?
Im Moment habe ich es geschafft, eine SQL-Anweisung zu erstellen, die alle Befehle zurückgibt, die ich zum Ausführen benötige:
SELECT 'TRUNCATE TABLE ' || tablename || ';' FROM pg_tables WHERE tableowner='MYUSER';
Aber ich sehe keine Möglichkeit, sie programmgesteuert auszuführen, sobald ich sie habe.
DECLARE r RECORD;
dann für Schleife:FOR r IN SELECT tablename FROM pg_tables LOOP
Explizite Cursor werden in plpgsql selten benötigt. Verwenden Sie den einfacheren und schnelleren impliziten Cursor einer
FOR
Schleife:Hinweis: Da Tabellennamen pro Datenbank nicht eindeutig sind, müssen Sie Tabellennamen schemaqualifizieren, um sicherzugehen. Außerdem beschränke ich die Funktion auf das Standardschema 'public'. Passen Sie sich Ihren Anforderungen an, schließen Sie jedoch die Systemschemata
pg_*
und ausinformation_schema
.Seien Sie sehr vorsichtig mit diesen Funktionen. Sie zerstören Ihre Datenbank. Ich habe eine Kindersicherung hinzugefügt. Kommentieren Sie die
RAISE NOTICE
Linie und kommentieren Sie,EXECUTE
um die Bombe zu zünden ...format()
erfordert Postgres 9.1 oder höher. In älteren Versionen verketten Sie die Abfragezeichenfolge wie folgt:Einzelbefehl, keine Schleife
Da wir
TRUNCATE
mehrere Tabellen gleichzeitig erstellen können, benötigen wir überhaupt keinen Cursor oder keine Schleife:Aggregieren Sie alle Tabellennamen und führen Sie eine einzelne Anweisung aus. Einfacher, schneller:
Anruf:
Verfeinerte Abfrage
Sie brauchen nicht einmal eine Funktion. In Postgres 9.0+ können Sie dynamische Befehle in einer
DO
Anweisung ausführen . Und in Postgres 9.5+ kann die Syntax noch einfacher sein:Über den Unterschied zwischen
pg_class
,pg_tables
undinformation_schema.tables
:Über
regclass
und zitierte Tabellennamen:Für den wiederholten Gebrauch
Erstellen Sie eine "Vorlagendatenbank" (nennen wir es
my_template
) mit Ihrer Vanillestruktur und allen leeren Tabellen. Dann gehen Sie durch einenDROP
/CREATE DATABASE
Zyklus:Das geht extrem schnell , da Postgres die gesamte Struktur auf Dateiebene kopiert. Keine Parallelitätsprobleme oder anderer Overhead, der Sie verlangsamt.
Wenn gleichzeitige Verbindungen Sie davon abhalten, die Datenbank zu löschen, beachten Sie Folgendes:
quelle
DROP DATABASE mydb
natürlich). Verwechseln Sie Schemata vielleicht mit Datenbanken?DO
Befehl wird (wie jede andere SQL-Anweisung) ausschließlich in der aktuellen Datenbank ausgeführt . Postgres hat keine Möglichkeit, in derselben Transaktion auf andere Datenbanken zuzugreifen. Sie müssten dazu dblink oder FDW verwenden. Es wirkt sich jedoch auf alle Schemas in der aktuellen Datenbank aus - es sei denn, Sie fügen hinzuWHERE t.schemaname = 'public'
, um den Effekt in diesem speziellen Fall auf ein bestimmtes Schema zu beschränken.Wenn ich dies tun muss, erstelle ich einfach ein Schema-SQL der aktuellen Datenbank, lösche und erstelle die Datenbank und lade dann die Datenbank mit dem Schema-SQL.
Nachfolgend sind die Schritte aufgeführt:
1) Erstellen Sie einen Schema-Dump der Datenbank (
--schema-only
)pg_dump mydb -s > schema.sql
2) Datenbank löschen
drop database mydb;
3) Datenbank erstellen
create database mydb;
4) Schema importieren
psql mydb < schema.sql
quelle
In diesem Fall ist es wahrscheinlich besser, nur eine leere Datenbank zu haben, die Sie als Vorlage verwenden. Wenn Sie eine Aktualisierung benötigen, löschen Sie die vorhandene Datenbank und erstellen Sie eine neue aus der Vorlage.
quelle
Könnten Sie dynamisches SQL verwenden, um jede Anweisung nacheinander auszuführen? Dazu müssten Sie wahrscheinlich ein PL / pgSQL-Skript schreiben.
http://www.postgresql.org/docs/8.3/static/plpgsql-statements.html (Abschnitt 38.5.4. Ausführen dynamischer Befehle)
quelle
Sie können dies auch mit bash tun:
Sie müssen Schemanamen, Kennwörter und Benutzernamen an Ihre Schemas anpassen.
quelle
Reinigungsversion
AUTO_INCREMENT
:quelle
Jungs, der bessere und sauberere Weg ist:
1) Erstellen Sie einen Schema-Dump der Datenbank (nur --schema-only) pg_dump mydb -s> schema.sql
2) Datenbank löschen Datenbank löschen mydb;
3) Datenbank erstellen Datenbank erstellen mydb;
4) Importieren Sie Schema psql mydb <schema.sql
Es funktioniert für mich!
Einen schönen Tag noch. Hiram Walker
quelle
Wenn Sie psql verwenden können, können Sie den
\gexec
Meta-Befehl verwenden, um die Abfrageausgabe auszuführen.Beachten Sie, dass dies
\gexec
in Version 9.6 eingeführt wirdquelle
Um die Daten zu entfernen und die Tabellenstrukturen in pgAdmin beizubehalten, haben Sie folgende Möglichkeiten :
quelle