Ändern/Neuordnen der Reihenfolge von Spalten: Werkzeug gesucht

saerdna

Fleissiger Benutzer
Beiträge
63
Laut Alter column position - PostgreSQL wiki ist ein Ändern der Reihenfolge von Spalten nicht möglich.

Nicht einmal ein Neuordnen ist möglich, wenn eine Spalte "mittendrin" gelöscht wird.

Wenn man z.B. die erste Spalte löscht, hat danach die ehemals zweite Spalte immer noch die Ordinalposition #2 statt #1.

Das hat mich schon erstaunt, dass eine so grundlegende Managementfunktion fehlt. Nun, das ist hinzunehmen.

Ein manuelles Neuanlegen einer Tabelle ist viel zu aufwändig.

Kennt ihr ein Werkzeug, welches "die nötigen Schritte, also dieses Neuanlegen der Tabelle" im Hintergrund übernimmt?

Danke.
 
Werbung:
Die Reihenfolge der Spalten in einer Tabelle ist völlig irrelevant (genauso wie es keine "Reihenfolge" bei den Zeilen gibt).
Es besteht kein Grund diese zu "sortieren". Das ist auch keine "grundlegende Managementfunktion" - es ist schlicht unnötig.

Keine der anderen "großen" Datenbanken (Oracle, SQL Server, DB2, SAP HANA, Teradata) bietet das - welches DBMS unterstützt denn sowas?

Wenn Du eine bestimmte Reihenfolge brauchst, dann schreibt ein SELECT Statement welches die Spalten in der von Dir gewünschten Reihenfolge anzeigt. Wenn Dir das bei jedem SELECT zu umständlich ist, leg eine View an.
 
Zusätzlich zur Antwort von @castorp :

Um das, was Du willst zu realisieren, müßte man die Tabelle physisch umordnen. Wir haben Kunden mit Tabellen im 3-stelligen GB-Bereich, und mehr.

Du könntest In-Place umsortieren, würde aber bei den Datenmengen sehr lange dauern. In der Zeit müsste man die Tabelle vollständig sperren. Man könnte in eine neue physische Datei schreiben - dann brauchst Du aber temporär sehr viel Platz. Und auch wieder eine entsprechende Sperre, und auch das geht nicht in NULL-KOMMA-NIX über die Bühne. Du müßtest alle Indexe aktualisieren. Die ganze Aktion würde sehr viel WAL-Traffic erzeugen, es könnte zu Verzögerungen in der Replikation kommen.

Wäre all das den Aufwand wert?

Bei allen Features, die die Community in PG einbaut, muß man sich immer die Frage stellen: skaliert das auch? Falls die Frage mit NEIN ausfällt, kommst Du damit nicht durch. Du kannst Dich gerne hinsetzen und was programmieren und vorschlagen, aber beachte immer: es muß skalieren, auch dann, wenn während solch einer Aktion noch 500 andere Anwender der Datenbank einen konsistenten und schnellen Zugriff auf die DB haben wollen...
 
@castorp
Mir ist nicht klar, wie zu der Ansicht gelangst, dass Reihenfolge keine Rolle spiele. In jeglicher linearer Struktur, die Menschen wohlüberlegt entwickeln, spielt Reihenfolge meiner Erfahrung nach eine Rolle. Zum Beispiel drückt sie Wichtigkeit aus.

Davon unabhängig:
Danke für eure Hinweise. Ich werde als hinnehmen, das man die Reihenfolge nur mit enormem Aufwand ändern kann.
 
die Reihenfolger der Spalten spielt keine Rolle im Ergebniss. Du kannst via Spaltenname auf einzelne Spalten zugreifen, und wenn Du wirklich auf eine Reihenfolge der Spalten beim Select oder Insert angewiesen bist (z.B. für CSV Im-/Export) dann nennen die Spalten in der von Dir nötigen Reihenfolge.
 
Mir ist nicht klar, wie zu der Ansicht gelangst, dass Reihenfolge keine Rolle spiele
Weil das im relationalen Modell so definiert ist.
Das Tupel (vorname, nachname) ist identisch zum Tupel (nachname, vorname) - Attribute werden über ihre Namen identifiziert (und verglichen), nicht über ihre Position. Streng genommen ist die Darstellung in "Tabellenform" (mit einer Kopfzeile die den Namen des Attributs darstellt) auch nicht ganz richtig.

SQL bildet die relationalen Konzepte nur bedingt korrekt ab (was auch immer wieder eine Kritik an SQL ist). Meistens sind diese Abweichungen oder Einschränkungen technisch bedingt. Für das Datenbanksystem ist es halt einfacher (und effizienter) wenn sich die Werte eines Attributs immer an der physisch gleichen Position innerhalb eines Datensatzes befinden - das ändert aber nichts an den grundlegenden Konzepten des relationalen Modells.

saerdna schrieb:
In jeglicher linearer Struktur, die Menschen wohlüberlegt entwickeln, spielt Reihenfolge meiner Erfahrung nach eine Rolle. Zum Beispiel drückt sie Wichtigkeit aus.

Das relationale Modell ist aber keine "lineare Struktur". Weder horizontal (Attribute), noch vertikal (Datensätze).

Im relationalen Modell gibt es auch keine "wichtigen" und "weniger wichtigen" Attribute einer Entität. Es gibt "ausgezeichnete" Attribute, die z.B. einen Fremdschlüssel darstellen. Wenn ein Attribut "unwichtig" wäre, würde man es eigentlich nicht modellieren.
 
Werbung:
Ihr missversteht mich. Für die Lesbarkeit, für den Überblick, für den Entwurfsprozess, für die Kognition spielt die Reihenfolge eine Rolle - auch wenn sie formal und technisch keine spielt.

In MariaDB, nur als neutrale Feststellung, kann man übrigens die Reihenfolge ändern:

MODIFY [COLUMN] [IF EXISTS] col_name column_definition
[FIRST | AFTER col_name]
 
Zurück
Oben