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?
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)
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?