Jak promować istniejący indeks do klucza podstawowego w PostgreSQL

13

Wiem, jak zrobić klucz podstawowy w tabeli, ale jak zrobić, aby istniejący indeks był kluczem podstawowym? Próbuję skopiować istniejącą tabelę z jednej bazy danych do drugiej. Kiedy pokazuję tabelę, indeks na dole ma następującą postać:

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

Utworzyłem indeks za pomocą:

CREATE INDEX my_index ON my_table (column1, column2)

Ale nie wiem, jak zrobić z tego klucz podstawowy ...

AKTUALIZACJA: Wersja mojego serwera to 8.3.3

WildBill
źródło
1
Jeśli my_index jest pokazany jako nazwę klucza podstawowego wtedy już mieć indeks. Nie ma PK bez (unikalnego) indeksu w Postgres
a_horse_w_n_nazwa
1
jaka jest twoja wersja PostgreSQL?
filiprem
Korzystam

Odpowiedzi:

16

Użyłbyś ALTER TABLE, aby dodać ograniczenie klucza podstawowego . W Postgres możesz „promować” indeks za pomocą formularza „ ALTER TABLE .. ADD table_constraint_using_index

Uwaga: indeks musi być oczywiście unikalny dla klucza podstawowego

ALTER TABLE my_table 
    ADD CONSTRAINT PK_my_table PRIMARY KEY USING INDEX my_index;
gbn
źródło
To nie działało dla mnie. Co to jest PK_my_table? Zakładam, że to etykieta i dołączam „PK_” do nazwy mojego stołu?
Wystąpił
1
@ngramsky: USING INDEXjest dostępny od 9.1. Sądzę więc, że nie korzystasz z bieżącej wersji
a_horse_w_na_nazwa
Nie, używam 8.3.3. Jak miałbym to zrobić w 8.3.3?
WildBill,
5
Jedynym sposobem na zrobienie tego w tej starożytnej wersji jest usunięcie indeksu i dodanie nowego ograniczenia pk.
a_horse_w_no_name
2
@a_horse_w_na_nazwie: powinieneś udzielić odpowiedzi: twój komentarz poprzedza drugą odpowiedź ...
gbn
7

Nie sądzę, aby można było przekonwertować indeks na klucz podstawowy w tej wersji postgresql.

Po prostu usunęłbym istniejący indeks i utworzyłem klucz podstawowy za pomocą podanych kolumn:

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

Pracował w 7.4 i 8.4

Craig Efrein
źródło
btw: „Jeśli TYLKO podano przed nazwą tabeli, tylko ta tabela zostanie zmieniona. Jeśli TYLKO nie zostanie określona, ​​tabela i wszystkie jej tabele potomne (jeśli istnieją) zostaną zmienione.”
Paolo,