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
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.
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.
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.
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.
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.
Ich habe das Problem für mich gelöst, schiebe aber gerne den Versuch einer Erklärung hinterher
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.
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…