serial hinzufügen und dabei ordnen

Hallo,

innerhalb einer Tabelle habe ich sehr viele Werte, aber keine explizit so genannte id, die auf einem serial beruht… die Daten liegen ungeordnet vor.
Nun möchte ich die Daten innerhalb der Tabelle nach einer bereits vorhandenen Spalte ordnen und anschließend mit dieser Ordnung ein serial Attribut hinzufügen…

Das das so einfach nicht geht, weiß ich. Leider kann ich die Tabelle nicht umkopieren, da ständig neue Daten auflaufen.
Meine Momentane Idee ist, eine id integer Spalte hinzuzufügen, mit einer Function die id nach meiner Ordnung zu inkrementieren und anschließend eine Sequenz zu erstellen…

Habt ihr bessere Ideen?
Viele Grüße
beho

Du wirst wohl um eine komplette Tabellensperre nicht drum herum kommen. Geht das? Falls ja, das Zufügen der ID-Spalte und die Sortierung der bisherigen Zeilen könnte so erfolgen:

test=# select * from unsortiert ;
   s
-------
 bla
 fasel
 a
 u
 b
 x
(6 rows)

test=*# alter table unsortiert add column id int;
ALTER TABLE
test=*# create sequence unsort;
CREATE SEQUENCE
test=*# update unsortiert set id = bla.id from (select nextval('unsort') as id, foo.s from (select s from unsortiert order by s)foo) bla where unsortiert.s=bla.s;
UPDATE 6
test=*# select * from unsortiert ;
   s   | id
-------+----
 a     |  1
 b     |  2
 bla   |  3
 fasel |  4
 u     |  5
 x     |  6
(6 rows)

Dann die ID-Spalte einen Constraint setzen, daß das nextval() von der Sequence wird.


Andreas

Hallo Andreas,

nein, ich kann die Tabelle leider nicht sperren. Da laufen in einem festen Intervall Messdaten auf. Leider ist der Intervall auch zu klein, bzw. die Datenmenge zu groß um alles im Zwischenzeitraum abzuarbeiten.

Ich werd das wohl lassen müssen und drauf hoffen, dass mir entsprechende Indizees den Zeitverlust beim auslesen wieder ausgleichen.

Viele Grüße
beho