Primary Key nachträglich einfügen

Hi Leute,
Ich hab eine befüllte datenbank vor mir (arbeite mit pgAdminIII), welche aber KEINEN Primary Key hat.
Meine Frage, wie bekomme ich nachträglich einen befüllten Primärschlüssel in die bestehenden Tabellen??
Probiert hab ich es mit

ALTER TABLE xy ADD COLUMN id_pk integer;

dabei wird die Spalte erzeugt ohne fehler, diese dann mit eindeutigen werten zu befüllen ist mein problem denn folgender befehl

ALTER TABLE xy ADD COLUMN id_pk integer PRIMARY KEY;
bringt den (selbst)verständlichen fehler, dass die Spalte Null werte beinhaltet…

gibt es irgend einen befehl um die Spalte inkrementiell befüllen zu lassen?
wie funktioniert das mir einer sequence?

hoffe auf hilfe,
grüße
Peter



test=*# create table bla(t text);
CREATE TABLE                     
test=*# insert into bla values('das');
INSERT 0 1
test=*# insert into bla values('nächste');
INSERT 0 1
test=*# insert into bla values('mal');
INSERT 0 1
test=*# insert into bla values('den');
INSERT 0 1
test=*# insert into bla values('pk');
INSERT 0 1
test=*# insert into bla values('nicht');
INSERT 0 1
test=*# insert into bla values('vergessen!');
INSERT 0 1
test=*# alter table bla add column id serial;
NOTICE:  ALTER TABLE will create implicit sequence "bla_id_seq" for serial column "bla.id"
ALTER TABLE
test=*# alter table bla add constraint pk primary key(id);
NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "pk" for table "bla"
ALTER TABLE
test=*# \d bla
                         Table "public.bla"
 Column |  Type   |                    Modifiers
--------+---------+--------------------------------------------------
 t      | text    |
 id     | integer | not null default nextval('bla_id_seq'::regclass)
Indexes:
    "pk" PRIMARY KEY, btree (id)

test=*# select * from bla;
     t      | id
------------+----
 das        |  1
 nächste    |  2
 mal        |  3
 den        |  4
 pk         |  5
 nicht      |  6
 vergessen! |  7
(7 rows)

Andreas

ja danke für die schnelle, und hilfreiche antwort…

also hat mir das ‘serial’ gefehlt…
ist das jetzt automatisch (durch den befehl serial) eine integer spalte?

ist es eine gute idee das alles in ein SQL Statement zu packen à la:

ALTER TABLE xy ADD COLUMN id SERIAL PRIMARY KEY;

ich muss das für 23 Tabellen durchführen…

der PK ist immer für eine Tabelle eindeutig oder geht das auch dass er für die ganze DB eindeutig ist?
gruß
Peter

Ja.

ist es eine gute idee das alles in ein SQL Statement zu packen à la:

ALTER TABLE xy ADD COLUMN id SERIAL PRIMARY KEY;

Ja.

ich muss das für 23 Tabellen durchführen…

Dein Problem. Man könnte das scripten, aber bei ‘nur’ 23Tabellen…

der PK ist immer für eine Tabelle eindeutig oder geht das auch dass er für die ganze DB eindeutig ist?
gruß
Peter

Ja, ja. Du kannst eine Sequence für mehr als eine Tabelle nehmen. Du könntest auch OID verwenden, aber das ist die schlechteste Variante, weil nicht empfohlen. Hast Du einen zwingenden Grund, daß der PK für mehr als eine Tabelle gelten soll?


Andreas