Reihenfolge der Spalten ändern

Hallo,

ich möchte in eine bestehende Tabelle drei weitere Spalten einfügen, d. h. sollen nicht, wie es per default geschieht, an die bestehenden Spalten drangehängt werden, sondern irgendwo dazwischen. BSP:

Bestehen Spalten: A | B | C
Neue Spalte D soll zwischen A und B, also
Neue Spalten: A | D | B | C

Danke

Eremit

Warum? Eigentlich ist die Reihenfolge der Darstellung Sache der zugreifenden Applikation bzw. des SQL-Statments.
Ich wüsste gerade keinen Weg, ausser droppen und neu anlegen.

Gruß Uwe

Für die Funktion der Datenbank ist dies auch nicht zwingend erforderlich. Die Daten werden aber über ein Excel-Frontend eingelesen -> Access -> PostgreSQL. Am Ende der alten Tabelle hängen Spalten, die die User normalerweise nicht unbedingt sehen sollten. In die neuen Spalten müßten sie aber zwingend eintragen. Also würden in der Eingabemaske einige für den Anwender unwichtige und verwirrende Spalten zwischenhängen. Daher meine Frage.

Und beim Droppen gehen mir doch alle Beziehungen flöten, derer es viele gibt, und die ich ungern alle wieder einrichten möchte.

In Access kann man Spalten einfügen, aber diese Änderung wird nicht an die PostgreSQL-Datenbank weitergereicht.

Irgendwelche Ideen?

Eremit

Definiere eine Tabelle, in der die Leute die Daten einfügen. Von dieser dann die Daten in die eigentliche Tabelle eintragen. Via TRIGGER zum Bleistift.

Andreas

Die nicht benutzten Spalten einfach nicht einlesen bzw darstellen. Zumindest mach ich das immer so, fördert nicht nur die Übersichtlichkeit. Die Darstellung im Frontend kannst du nach Belieben gestalten ohne Postgres anfassen zu müssen.

Gruß Uwe

Das hört sich für mich so an, als ob die Daten mittels SELECT * ausgelesen werden … immer ein böser Fehler.
Wenn sich deine Applikation auf die Reihenfolge der Spalten, die Reihenfolge der Datensätze ect. verlässt, geht das irgendwann schief.

Für die Reihenfolge der Datensätze gibt es ORDER BY, für die Reihenfolge der Spalten gibt man diese in der gewünschten Reihenfolge beim SELECT an.

Thema erledigt.

hmm, wozu dient denn access?

Oder wozu ein excel frontend, wennde schon access verwenden willst?

Mir scheint die architektur etwas … hmm … erklärungsbedürftig

Ansonsten stimme ich mit ads überein, nutze vernünftig definierte Queries und alles ist gut

Ich habe das Problem für mich gelöst, schiebe aber gerne den Versuch einer Erklärung hinterher :wink:

Die Datenbank ist im Moment noch weitgehend leer. Später sollen Daten mittels eines Delphi-Frontends eingetragen werden. Dieses Frontend, das nicht ich programmiere und mit dem ich nichts zu tun habe, verwendet eine Komponente, über die Datenbanktabellen als Grid dargestellt und bearbeitet werden können. Die Eingaben werden lokal und temporär in Access-Tabellen gespeichert.

Um den ersten Schwung von einigen tausend Datensätzen auf möglichst einfachem Wege einzuspielen, wollte ich die in Excel bereits vorliegenden Daten in eine Access-Datei laden, die per ODBC mit der PostgreSQL-Datenbank verbunden ist, und dann direkt in die PostgreSQL-Datenbank einspielen.

Das ist in einigen Fällen auch gegangen, in anderen Fällen verweigerte sich Access aus mir unerfindlichen Gründen. Daraufhin habe ich (erfolgreich) begonnen, die ersten Daten als Textdateien (TAB-getrennt) über das phppgAdmin-Interface einzuspielen. Der einzige Wehrmutstropfen ist, dass die timestamp Felder mit der Vorgabe = now() auf diesem Wege auch nach dem Speichern nur NULL enthalten. Ich werde diesem Wege dennoch weiterhin treu bleiben, da mir Access einfach zu unberechenbar ist.

Ach ja, und die betreffenden Spalten, um die sich meine Frage drehte: netterweise war nur eine einzige von ihnen verknüpft. Also habe ich mit einer Reihe von alter table add column oder drop column Befehlen alles so zurecht gerückt, wie ich es haben wollte. Die eine Spalte konnte ich mit alter table add constraint wieder verknüpfen.

Die Funktionsfähigkeit der Datenbank wird durch die Reihenfolge der Spalten oder durch die Reihenfolge, in der diese ausgefüllt werden - selbstverständlich ! - nicht tangiert.

Vielen Dank für die Antworten

Eremit

Das geht einfacher. Aus Excel einfach als CSV speichern und mittels COPY aus psql heraus einlesen. Deine Timestamp-Felder beim COPY-Befehl nicht angeben, dann klappt auch das.

test=*# create table in_copy (id int, ts timestamptz default now(), name text);
CREATE TABLE
Time: 258.037 ms
test=*# copy in_copy (id, name) from stdin csv delimiter ';';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1;foo
>> 2;bar
>> \.
test=*# select * from in_copy;
 id |              ts               | name
----+-------------------------------+------
  1 | 2007-12-21 14:53:20.805989+01 | foo
  2 | 2007-12-21 14:53:20.805989+01 | bar
(2 rows)

… mal als Beispiel.

Mit dem COPY-Befehl kann man viele Dinge prima automatisieren, auf Arbeit z.B. bekomme ich jede Nacht etliche tausend Datensätze, die in diverse Tabellen zu verteilen sind. Wenn ich das händisch via Excel->Access->phpDingens und so weiter machen müßte…


Andreas

Cool… Das werde ich im neuen Jahr doch gleich mal ausprobieren! :slight_smile:
Vielen Dank
Eremit