PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Postgres: Spalte einfügen in bestehende Tabelle


Gast
2003-06-26, 14:39:31
hi,
wie kann ich bei der postgres-db in eine bestehende tabelle eine spalte einfügen?
hinzukommt allerdings noch, dass die spalte irgendwo in der mitte eingefügt werden soll.

also ungefähr so: alte_spalte1, alte_spalte2, neue_spalte, alte_spalte3

HellHorse
2003-06-26, 15:59:16
Per ALTER TALBE (http://www.postgresql.org/docs/view.php?version=7.2&idoc=0&file=sql-altertable.html).

Ist dir die Reihenfolge wichtig, schreibst du sie am besten ins SELECT rein.

Gast
2003-06-26, 20:45:38
Entschuldige, aber verstehe das im Link nicht und das mit dem Select im Alter Table schon gar nicht :( .
Kannst du mal ein Beispiel machen?

HellHorse
2003-06-26, 22:17:58
Ok, du hast eine Relation mit dem Namen nameDerRelation und den Attributen attribut1, attribut2 und attribut3. (Boah, bin ich kreativ)
Du machst ein SELECT darauf, und willst, dass erst das Attribut attribut1, dann das Attribut attribut2 und dann das Attribut attribut3 kommt.

Du kannst entweder:

SELECT *
FROM nameDerRelation;

machen und hoffen, dass es gut geht. Oder du machst:

SELECT attribut1, attribut2, attribut3
FROM nameDerRelation;

Jetzt willst du der Relation nameDerRelation noch das Attribut attribut4 hinzufügen:

ALTER TABLE nameDerRelation ADD COLUMN attribut4 VARCHAR(60) NOT NULL;

(natürlich kann es irgend ein Datentyp mit irgendwelchen constraints und Defaultwerten sein)

Jetzt möchtest du ein SELECT darauf machen, aber attribut4 soll zwischen attribut2 und attribut3 erscheinen:

SELECT attribut1, attribut2, attribut4, attribut3
FROM nameDerRelation;

Aqualon
2003-06-26, 22:46:21
Original geschrieben von HellHorse


SELECT attribut1, attribut2, attribut4, attribut3
FROM nameDerRelation;


Ist das nicht schlecht für die Performance, wenn man Einträge in einer anderen Reihenfolge ausliest, als sie in der Tabelle drinstehn?

Ausserdem kann man doch beim Auswerten der Einträge den Namen angeben, oder geht das in postgres nicht?

Aqua

Haarmann
2003-06-27, 09:40:10
Da ich ne faule Sau bin, machte ich sowas immer über ne neue Table. Create Table Neu wo die neuen Atts drin stehen mit dem gleichen Key der alten Table. Danach Create Table Neu2, das danach mit nem einfach Inhalt aus nem Natural Join der beiden vorhergehenden Tables gefüllt wird. 2 Tables droppen, den Alten Namen wieder Createn und gleich füllen mit der Table Neu2.
Sieht aus wie Murks, sorgt aber dafür, dass die Table zusammenhängend ist. Aufblasen und schrumpfen kann mans auch, so man das will.

Gast
2003-06-27, 12:05:21
Original geschrieben von HellHorse
Ok, du hast eine Relation mit dem Namen nameDerRelation und den Attributen attribut1, attribut2 und attribut3. (Boah, bin ich kreativ)
Du machst ein SELECT darauf, und willst, dass erst das Attribut attribut1, dann das Attribut attribut2 und dann das Attribut attribut3 kommt.

Du kannst entweder:

SELECT *
FROM nameDerRelation;

machen und hoffen, dass es gut geht. Oder du machst:

SELECT attribut1, attribut2, attribut3
FROM nameDerRelation;

Jetzt willst du der Relation nameDerRelation noch das Attribut attribut4 hinzufügen:

ALTER TABLE nameDerRelation ADD COLUMN attribut4 VARCHAR(60) NOT NULL;

(natürlich kann es irgend ein Datentyp mit irgendwelchen constraints und Defaultwerten sein)

Jetzt möchtest du ein SELECT darauf machen, aber attribut4 soll zwischen attribut2 und attribut3 erscheinen:

SELECT attribut1, attribut2, attribut4, attribut3
FROM nameDerRelation;

Wenn das nun richtig verstehe (was sicherlich nicht der fall ist), dann sieht die tabelle NACHHER so aus

attribut1, attribut2, attribut3, attribut4
(attribut1 - attribut3 sind die alten attribute, attribut4 das neuhinzugefügte)

Wenn ich nun mit Select * die tabelle auslese, dann bekomme ich aber nicht die tabelle, die ich haben möchte.

ich möchte ja
attribut1, attribut2, attribut4, attribut3
bekommen.

ich kann nicht meinen kompletten php-code umstellen, nur um spaltenreihenfolge anzupassen. das muss "in" der tabelle passieren.


blöd wenn man ( <-ich ) keine ahnung von datenbanken hat :(

Aqualon
2003-06-27, 12:20:05
Original geschrieben von Gast
ich kann nicht meinen kompletten php-code umstellen, nur um spaltenreihenfolge anzupassen. das muss "in" der tabelle passieren.

Als grundsätzliche Regel solltest du beachten, dass man sich nie auf die Auslesereihenfolge einer Datenbank verlassen sollte. Abgesehen davon ist ein select * nie empfehlenswert, weil immer noch weitere Spalten hinzukommen können, die man u.U. bei dem Select gar nicht benötigt und was sich dann negativ auf die Performance auswirkt.

Ich kenn mich mit PostgreSQL selbst nicht aus, aber bei MySQL kann ich in PHP sagen, welche Variable er auslesen soll.


$res=mysql_query("select * from Tabelle1");
$Att1=mysql_result($res,0,'Tabelle1.Att1');
$Att2=mysql_result($res,0,'Tabelle1.Att2');


Geht das bei PostgreSQL nicht?

Aqua

HellHorse
2003-06-27, 12:22:52
Original geschrieben von Aqualon
Ist das nicht schlecht für die Performance, wenn man Einträge in einer anderen Reihenfolge ausliest, als sie in der Tabelle drinstehn?
...
Ich denke nicht. Falls es wirklich schlechter ist dann minimal. Ob du nun in einem Array/einer Liste erst auf die Elemente 0, dann 1, dann 2 oder 1, dann 2, dann 0 zugreiffst ist eigentlich egal.
Natürlich kann ich mich irren. Vielleich weiss es stabilo_boss13.

Original geschrieben von Aqualon
....
Ausserdem kann man doch beim Auswerten der Einträge den Namen angeben, oder geht das in postgres nicht?

Aqua
Doch natürlich, aber Gast war es wichtig, dass das neue Attribut "in der Mitte" ist.

HellHorse
2003-06-27, 13:14:21
Original geschrieben von Gast
Wenn das nun richtig verstehe (was sicherlich nicht der fall ist), dann sieht die tabelle NACHHER so aus

attribut1, attribut2, attribut3, attribut4
(attribut1 - attribut3 sind die alten attribute, attribut4 das neuhinzugefügte)

Wenn ich nun mit Select * die tabelle auslese, dann bekomme ich aber nicht die tabelle, die ich haben möchte.

ich möchte ja
attribut1, attribut2, attribut4, attribut3
bekommen.

ich kann nicht meinen kompletten php-code umstellen, nur um spaltenreihenfolge anzupassen. das muss "in" der tabelle passieren.


blöd wenn man ( <-ich ) keine ahnung von datenbanken hat :(

Du schreibst statt

SELECT *

einfach

SELECT attribut1, attribut2, attribut4, attribut3

Das Resultat ist nicht zu unterscheiden.

Falls das zu viel Aufwand ist, benennst du die Relation nameDerRalation in andererNameDerRalation um. Dann machst du einen View nameDerRalation mit.
SELECT attribut1, attribut2, attribut4, attribut3
FROM andererNameDerRalation

Gast
2003-06-28, 23:47:20
1000 dank.
ich habs die view-lösung benutzt.