PostgreSQL'de mevcut bir dizin birincil anahtara nasıl yükseltilir


13

Bir tablo içinde birincil bir anahtar yapmak biliyorum, ama var olan bir dizin birincil anahtar nasıl yapabilirim? Varolan bir tabloyu bir veritabanından diğerine kopyalamaya çalışıyorum. Tabloyu gösterdiğimde, alttaki dizin bu biçimde:

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

Ben endeksi ile oluşturduk:

CREATE INDEX my_index ON my_table (column1, column2)

Ama nasıl birincil anahtar yapacağımı bilmiyorum ...

GÜNCELLEME: Sunucumun sürümü 8.3.3


1
My_index birincil anahtar adı olarak gösterilirse o zaman zaten var bir dizin. Postgres'te (benzersiz) bir dizine sahip olmayan PK yok
a_horse_with_no_name 14:11

1
PostgreSQL sürümünüz nedir?
filiprem

8.3.3
WildBill

Yanıtlar:


16

Birincil anahtar kısıtlamasını eklemek için ALTER TABLE kullanırsınız . Postgres'de " ALTER TABLE .. ADD table_constraint_using_index" formunu kullanarak bir dizini "tanıtabilirsiniz"

Unutmayın, dizin birincil anahtar için benzersiz olmalıdır

ALTER TABLE my_table 
    ADD CONSTRAINT PK_my_table PRIMARY KEY USING INDEX my_index;

Bu benim için işe yaramadı. PK_my_table nedir? Bunun bir etiket olduğunu ve masamın adına 'PK_' eklediğimi varsayalım? "HATA: sözdizimi hatası karakter 83" veya "USING" yakınında sözdizimi hatası
aldım

1
@ngramsky: 9.1'den USING INDEXberi mevcuttur. Yani şu anki sürümü çalıştırmıyorsunuz
a_horse_with_no_name 14:11

Hayır, 8.3.3 kullanıyorum 8.3.3'te bunu nasıl yapabilirim?
WildBill

5
Bu eski versiyonda yapmanın tek yolu, dizini bırakmak ve yeni bir pk kısıtlaması eklemektir.
a_horse_with_no_name

2
@a_horse_with_no_name: bir cevap vermelisiniz: Yorumunuz diğer cevaptan önce gelir ...
gbn

7

Ben postgresql bu sürümünde bir birincil anahtar bir dizin dönüştürmek mümkün sanmıyorum.

Ben sadece mevcut dizini bırakın ve belirttiğiniz sütunları kullanarak birincil anahtar oluşturmak .:

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

7.4 ve 8.4'te çalıştı


btw, "SADECE tablo adından önce belirtilirse, yalnızca bu tablo değiştirilir. SADECE belirtilmezse, tablo ve tüm alt tabloları (varsa) değiştirilir."
Paolo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.