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
Geändert von Gisman (21.12.2007 um 13:13 Uhr)
Have a lot of fun!
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
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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
Have a lot of fun!
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.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
explain analyze is your friend
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.
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.
... mal als Beispiel.Code: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)
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
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Cool... Das werde ich im neuen Jahr doch gleich mal ausprobieren! :-)
Vielen Dank
Eremit
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen