Ändern Sie die vorhandene Spalte in PG in einen automatisch inkrementellen Primärschlüssel

11

Ich habe eine Datenbank in Postgresql, die von SQL Server migriert wurde (nur Daten).
Unter SQL Server enthält eine Tabelle aus dieser Datenbank die folgenden Spalten:

measure_id
datum
measure

Dabei measure_idhandelt es sich um einen automatisch inkrementellen Primärschlüssel, datumum datetime und measureum float.
Nach der Migration in Postrgresql measure_idist Spalte vom Typ bigint.

Wie kann ich diese Spalte ( measure_id) in bigserial ändern und als Primärschlüssel zuweisen, nachdem meine Tabelle voller Daten ist?

Zetah
quelle

Antworten:

16

Erstellen Sie eine Sequenz und verwenden Sie sie als Standardwert für die Spalte:

create sequence measures_measure_id_seq
   owned by measures.measure_id;

alter table measures
   alter column measure_id set default nextval('measures_measure_id_seq');

commit;

Das ist im Wesentlichen was serialtut.

Weitere Informationen finden Sie im Handbuch:
http://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL

ein Pferd ohne Name
quelle
OK danke. Können Sie einfach eine Notiz hinterlassen, was zu owned by measures.measure_idtun ist?
Zetah
@zetah: Zitat aus dem Handbuch (der Link, den ich hinzugefügt habe): " Die Sequenz ist als" im Besitz der Spalte "markiert, so dass sie gelöscht wird, wenn die Spalte oder Tabelle gelöscht wird "
a_horse_with_no_name
2
Ah, alles klar, es ist wie eine Dekoration. Ich erwähnte, dass die Tabelle bereits Daten enthält, die neu erstellte Sequenz jedoch die bereits vorhandenen Daten nicht berücksichtigt und ab 1 zählt, was beim ersten neuen Einfügen aufgrund einer eindeutigen Einschränkung zu einem Fehler führt. Wenn also jemand anderes dies liest, ist es korrekter zu verwenden, CREATE SEQUENCE seq START WITH xwo x die letzte Zeile ist ( SELECT MAX(measure_id)+1 FROM measuresin meinem Fall)
zetah
1
@zetah Danke für dieses Update. Wie würden Sie in diesem Fall eine Abfrage schreiben? Ich habe es versucht, CREATE SEQUENCE seq START WITH (SELECT MAX(measure_id)+1 FROM measures); aber das scheint nicht der richtige Weg zu sein.
neugierig
Was Sie versuchen zu tun ist: Wählen Sie setval ('sequenceX', (wählen Sie max (table_id) +1 aus der Tabelle), false) Hier gefunden: stackoverflow.com/questions/2022559/…
HydrUra