Cara mempromosikan indeks yang ada ke kunci utama di PostgreSQL

13

Saya tahu cara membuat kunci utama di dalam tabel, tetapi bagaimana cara membuat indeks yang ada menjadi kunci utama? Saya mencoba untuk menyalin tabel yang ada dari satu database ke yang lain. Ketika saya menunjukkan tabel, indeks di bagian bawah adalah dalam formulir ini:

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

Saya telah membuat indeks dengan:

CREATE INDEX my_index ON my_table (column1, column2)

Tapi saya tidak tahu bagaimana membuatnya menjadi kunci utama ...

UPDATE: Versi server saya adalah 8.3.3

WildBill
sumber
1
Jika my_index ditampilkan sebagai nama kunci utama maka Anda sudah memiliki indeks. Tidak ada PK tanpa indeks (unik) di Postgres
a_horse_with_no_name
1
apa versi PostgreSQL Anda?
filiprem
Saya menjalankan 8.3.3
WildBill

Jawaban:

16

Anda akan menggunakan ALTER TABLE untuk menambahkan batasan kunci utama . Di Postgres Anda dapat "mempromosikan" suatu indeks menggunakan ALTER TABLE .. ADD table_constraint_using_indexformulir " "

Catatan, indeks harus unik tentu saja untuk kunci utama

ALTER TABLE my_table 
    ADD CONSTRAINT PK_my_table PRIMARY KEY USING INDEX my_index;
gbn
sumber
Itu tidak berhasil untuk saya. Apa itu PK_my_table? Saya menganggap ini adalah label dan saya menambahkan 'PK_' ke nama meja saya? Saya mendapat kesalahan sintaks yang mengatakan "ERROR: kesalahan sintaks pada atau dekat" MENGGUNAKAN "pada karakter 83"
WildBill
1
@ngramsky: USING INDEXtersedia sejak 9.1. Jadi saya kira Anda tidak menjalankan versi saat ini
a_horse_with_no_name
Tidak, saya menggunakan 8.3.3 Bagaimana saya bisa melakukan itu di 8.3.3?
WildBill
5
Satu-satunya cara untuk melakukannya dalam versi kuno itu adalah dengan menjatuhkan indeks dan menambahkan batasan pk baru.
a_horse_with_no_name
2
@a_horse_with_no_name: Anda harus membuat jawaban itu: komentar Anda mendahului jawaban yang lain ...
gbn
7

Saya rasa tidak mungkin mengubah indeks menjadi kunci utama dalam versi postgresql itu.

Saya hanya akan menjatuhkan indeks yang ada dan membuat kunci utama menggunakan kolom yang Anda tentukan .:

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

Bekerja di 7.4 dan 8.4

Craig Efrein
sumber
btw, "Jika HANYA ditentukan sebelum nama tabel, hanya tabel itu yang diubah. Jika HANYA tidak ditentukan, tabel dan semua tabel turunannya (jika ada) diubah."
Paolo