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?
190
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?
( Aktualisiert - Danke an die Leute, die kommentiert haben )
Angenommen, Sie haben eine Tabelle mit dem Namen test1
, zu der 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;
In alten Versionen von PostgreSQL (vor 8.x?) Mussten Sie die ganze Drecksarbeit erledigen. 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');
Auch in neueren Versionen von Postgres entspricht dies in etwa dem obigen Einzelbefehl.
ADD PRIMARY KEY
auch ein erstellt wirdNOT NULL
erwartungsgemäß und gewünscht Einschränkung (getestet in Postgres 9.3) erstellt wird.ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
Das ist alles was Sie brauchen:
id
Spalte hinzu@Resnyanskiy, der diese Antwort in einem Kommentar gegeben hat, wird gutgeschrieben.
quelle
ALTER TABLE <table> DROP CONSTRAINT <pkey_name>;
So verwenden Sie eine Identitätsspalte in Version 10:
Eine Erläuterung der Identitätsspalten finden Sie unter https://blog.2ndquadrant.com/postgresql-10-identity-columns/ .
Für den Unterschied zwischen GENERATED BY DEFAULT und GENERATED IMMER siehe 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/ .
quelle
SQL Error [23502]: ERROR: column "id" contains null values
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 in PostgreSQL 9.6.4 verwendet habe.
quelle