it-swarm.com.de

Wie füge ich in PostgreSQL einen automatisch inkrementierenden Primärschlüssel zu einer vorhandenen Tabelle hinzu?

Ich habe eine Tabelle mit vorhandenen Daten. Gibt es eine Möglichkeit, einen Primärschlüssel hinzuzufügen, ohne die Tabelle zu löschen und neu zu erstellen?

167
xRobot

(Aktualisiert - Danke an die Leute, die kommentiert haben)

Moderne Versionen von PostgreSQL

Angenommen, Sie haben eine Tabelle mit dem Namen test1, zu dem Sie eine automatisch inkrementierende Primärschlüsselspalte id (Ersatzspalte) hinzufügen möchten. Der folgende Befehl sollte in neueren Versionen von PostgreSQL ausreichen:

   ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;

Ältere Versionen von PostgreSQL

In alten Versionen von PostgreSQL (vor 8.x?) Mussten Sie die ganze Drecksarbeit machen. Die folgende Befehlsfolge sollte den Trick ausführen:

  ALTER TABLE test1 ADD COLUMN id INTEGER;
  CREATE SEQUENCE test_id_seq OWNED BY test1.id;
  ALTER TABLE test ALTER COLUMN id SET DEFAULT nextval('test_id_seq');
  UPDATE test1 SET id = nextval('test_id_seq');

In neueren Versionen von Postgres entspricht dies in etwa dem obigen Einzelbefehl.

310
leonbloy
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;

Das ist alles was Sie brauchen, um:

  1. Fügen Sie die Spalte id hinzu
  2. Füllen Sie es mit einer Sequenz von 1 bis count (*).
  3. Legen Sie es als Primärschlüssel/nicht null fest.

Wir danken @resnyanskiy, der diese Antwort in einem Kommentar gegeben hat.

47
Synesso

So verwenden Sie eine Identitätsspalte in Version 10:

ALTER TABLE test 
ADD COLUMN id { int | bigint | smallint}
GENERATED { BY DEFAULT | ALWAYS } AS IDENTITY PRIMARY KEY;

Eine Erklärung der Identitätsspalten finden Sie unter https://blog.2ndquadrant.com/postgresql-10-identity-columns/ .

Den Unterschied zwischen GENERATED BY DEFAULT und GENERATED IMMER finden Sie unter https://www.cybertec-postgresql.com/de/sequences-gains-and-pitfalls/ .

Informationen zum Ändern der Reihenfolge finden Sie unter https://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/ .

6
jhoanna

Ich bin hier gelandet, weil ich auch so etwas gesucht habe. In meinem Fall habe ich die Daten aus einer Reihe von Staging-Tabellen mit vielen Spalten in eine Tabelle kopiert und gleichzeitig der Zieltabelle Zeilen-IDs zugewiesen. Hier ist eine Variante der oben genannten Ansätze, die ich verwendet habe. Ich habe die serielle Spalte am Ende meiner Zieltabelle hinzugefügt. Auf diese Weise muss ich in der Insert-Anweisung keinen Platzhalter dafür haben. Dann füllte eine einfache Auswahl * in der Zieltabelle diese Spalte automatisch aus. Hier sind die beiden SQL-Anweisungen, die ich unter PostgreSQL 9.6.4 verwendet habe.

ALTER TABLE target ADD COLUMN some_column SERIAL;
INSERT INTO target SELECT * from source;
2
Dean Sha