TRUNCATE auf alle Tabellen

Hi,
wie kann ich alle Tabellen in meiner DB auf einmal leeren?

TRUNCATE auf eine Tabelle ist klar, jedoch habe ich 30 Tabellen, welche auch noch miteinander verknüpft sind. Daher muss noch ein CASCADE dahinter.

Hier habe ich etwas gefunden:

Alle Tabellen, die mit xyz_ beginnen löschen:

user@host> psql -t -c "SELECT 'DROP TABLE ' || tablename  || ' CASCADE ;' FROM pg_catalog.pg_tables where tablename like 'xyz_%'" > droptables

Karl

Wo ist jetzt das Problem?

Andreas

TRUNCATE … CASCADE funktioniert doch …

was du da mit dem SELECT 'DROP … ’ … allerdings willst weiss ich auch nicht

SELECT ‘TRUNCATE TABLE ’ || tablename || ’ CASCADE ;’ FROM pg_catalog.pg_tables where tablename like ‘%’

Das Ergebnis ist eine Tabelle:

?Column?
TRUNCATE TABLE ctrl__rotstift_notiz CASCADE ;




Geleert wird aber nichts.

Is klar, ne?

Ich bin heute mal nicht so. Also, er bastelt sich damit ein SQL-File, was alle Befehle enthält.

Andreas

Oh mann…

Das resultat ist eine Datei, welche Deine Truncate-Befehle enthält. Diese kannst Du in psql einlesen und ausführen.


Andreas

Allerdings bleibt anzumerken, daß man Dinge, die man nicht versteht, nicht tun sollte. Wenn Du Deinen Code erfolgreich so änderst, daß nicht nur Tabellen, die mit xyz_ anfangen getroffen werden sondern alle, dann hast Du möglicherweise nicht das erreicht, was Du erreichen willst.

Andreas

Glasklar - v.a. weil er DROP TABLE Code erzeugt - obwohl er sie TRUNCATEN will … du verstehst meine Bedenken?

unwesentliches Detail :wink:

Andreas

Ich habe doch oben geschrieben : Hier habe ich etwas gefunden
Das war beispielhaft, in dem Fall halt ein Drop.

So geht’s:

user@host: psql -U user -d dbname -t -c "SELECT 'TRUNCATE TABLE ' || tablename  || ' CASCADE ;' FROM pg_catalog.pg_tables where tablename like '%'" > leeren

user@host: psql -U user -d dbname -f leeren

PostgreSQL Datenbank Tipps
unter Punkt 4.

Gratulation. Damit hast Du auch alle Systemtabellen leer gemacht bzw. es zumindest versucht. Ob das klappt, weiß ich nicht, nie probiert. Falls nun irgendwas nicht klappt, dürfte es aber daran liegen.

Andreas

Es werden nur die Tabellen gelöscht, wenn ich das Recht dazu habe.

Gibt es aber auch eine Möglichkeit, nur selbst erstellte Tabellen auszuwählen?

Es ist schön, daß es solche Fangnetze gibt, aber leichtsinnig sich auf deren Funktion blind zu verlassen.

Gibt es aber auch eine Möglichkeit, nur selbst erstellte Tabellen auszuwählen?

Ja. Du schaust Dir nun bitte den Aufbau der Tabelle pg_catalog.pg_tables an und wirst ganz sicher selber erkennen, wie das geht.

Andreas

du solltest dir zunaechst pg_tables mal ausgeben lassen

dann wirst du sehen, dass es einen ownername gibt - der wird aber wahrscheinlich ungeeignet sein, weil der owner deiner “eigenen” tables auch der owner von systemtabellen sein kann - z.B. wenn du bisher nur mit dem std. user gearbeitet hast

dann gibt es noch die spalte schemaname - der bietet sich wahrscheinlich eher an - z.B. wenn du dein eigenes schema benutzt :slight_smile: ansonsten halt das standard-schema - nennt sich public …

alles in allem ist das aber eine sehr hakelige angelegeneheit …

Wenn du die View meinst, dann ist es klar. (Die Tabelle gibt es nicht)
Außer man ist als Postgres angemeldet.

Ähm, ja.

Außer man ist als Postgres angemeldet.

Auch dann nicht.

Andreas