Hochstufen eines vorhandenen Index auf den Primärschlüssel in PostgreSQL

13

Ich weiß, wie man einen Primärschlüssel in einer Tabelle erstellt, aber wie mache ich einen vorhandenen Index zu einem Primärschlüssel? Ich versuche, eine vorhandene Tabelle von einer Datenbank in eine andere zu kopieren. Wenn ich die Tabelle zeige, sieht der Index unten so aus:

"my_index" PRIMARY KEY, btree (column1, column2)

Ich habe den Index erstellt mit:

CREATE INDEX my_index ON my_table (column1, column2)

Aber ich weiß nicht, wie ich es zum Primärschlüssel machen soll ...

UPDATE: Die Version meines Servers ist 8.3.3

WildBill
quelle
1
Wenn my_index als Name des Primärschlüssels angezeigt wird, haben Sie bereits einen Index. Es gibt keine PK ohne (eindeutigen) Index in Postgres
a_horse_with_no_name
1
Was ist Ihre PostgreSQL-Version?
Filiprem
Ich laufe 8.3.3
WildBill

Antworten:

16

Sie würden ALTER TABLE verwenden , um die Primärschlüssel hinzuzufügen Einschränkung . In Postgres können Sie einen Index über das ALTER TABLE .. ADD table_constraint_using_indexFormular " " " " promoten

Beachten Sie, dass der Index für einen Primärschlüssel natürlich eindeutig sein muss

ALTER TABLE my_table 
    ADD CONSTRAINT PK_my_table PRIMARY KEY USING INDEX my_index;
gbn
quelle
Das hat bei mir nicht geklappt. Was ist PK_my_table? Ich nehme an, dies ist eine Bezeichnung und ich hänge 'PK_' an den Namen meiner Tabelle an. Ich habe einen Syntaxfehler mit der Meldung "ERROR: Syntaxfehler bei oder in der Nähe von" USING "bei Zeichen 83"
WildBill
1
@ngramsky: USING INDEXist verfügbar seit 9.1. Ich
nehme an,
Nein, ich verwende 8.3.3. Wie würde ich das in 8.3.3 machen?
WildBill
5
Die einzige Möglichkeit, dies in dieser alten Version zu tun, besteht darin, den Index zu löschen und eine neue pk-Einschränkung hinzuzufügen.
a_horse_with_no_name 15.12.11
2
@a_horse_with_no_name: du solltest das als Antwort geben: dein Kommentar geht der anderen Antwort
voraus
7

Ich denke nicht, dass es in dieser Version von postgresql möglich ist, einen Index in einen Primärschlüssel umzuwandeln.

Ich würde einfach den vorhandenen Index löschen und den Primärschlüssel unter Verwendung der von Ihnen angegebenen Spalten erstellen:

DROP INDEX my_index;
ALTER TABLE ONLY my_table ADD CONSTRAINT pk_my_table PRIMARY KEY(column1,column2);

Arbeitete in 7.4 und 8.4

Craig Efrein
quelle
Übrigens: "Wenn NUR vor dem Tabellennamen angegeben wird, wird nur diese Tabelle geändert. Wenn NUR nicht angegeben wird, werden die Tabelle und alle untergeordneten Tabellen (falls vorhanden) geändert."
Paolo