Zaten oluşturulduktan sonra PostgreSQL tablosuna UNIQUE kısıtlaması ekleyebilir miyim?


185

Aşağıdaki tablo var:

 tickername | tickerbbname  | tickertype
------------+---------------+------------
 USDZAR     | USDZAR Curncy | C
 EURCZK     | EURCZK Curncy | C
 EURPLN     | EURPLN Curncy | C
 USDBRL     | USDBRL Curncy | C
 USDTRY     | USDTRY Curncy | C
 EURHUF     | EURHUF Curncy | C
 USDRUB     | USDRUB Curncy | C

Ben herhangi bir verilen tickername/ tickerbbnameçift için hiç birden fazla sütun olmasını istemiyorum . Tabloyu zaten oluşturdum ve içinde çok fazla veri var (zaten benzersiz kriterleri karşıladığından emin oldum). Ancak, büyüdükçe, hata için yer açılır.

UNIQUEBu noktada bir sınırlama eklemenin bir yolu var mı ?


Yanıtlar:


363

psqlinline yardımı:

\h ALTER TABLE

Ayrıca postgres belgelerinde de belgelenmiştir (mükemmel bir kaynak ve ayrıca okunması kolay).

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);

6
teşekkürler @hhaamu. Evet, belgeleri denedi ama yukarıdakileriniz çok daha özlü.
Thomas Browne

117
PostgreSQL'in dizin adını oluşturmasına izin vermek istiyorsanız, kullanın ALTER TABLE tablename ADD UNIQUE (columns);. ( CONSTRAINTAnahtar kelimenin atlanması gerektiğini unutmayın .)
jpmc26 26:14

5
Bu sorunun cevabına ihtiyacım vardı ve dokümanlar için googling yapmaya başladım. Postgres belgeleri yerine, StackOverflow'da bu konuya girdim. Bu nedenle, resmi dokümanlara referans vermek iyi bir fikir olsa da, gelecekteki ziyaretler için cevap vermek de çok iyidir. Bunun için teşekkür ederim.
Leonard

@ jpmc26 «PostgreSQL'in dizin adını oluşturmasına izin vermek istiyorsanız» Kısıtlama adını mı kastediyorsunuz?
tuxayo

4
@tuxayo, benzersiz bir kısıtlama Postgres (bilgiçlikle değil) bir dizin yoluyla uygulanır.
Chris W.

36

Evet yapabilirsin. Ancak tablonuzda benzersiz olmayan girişler varsa, başarısız olur. Tablonuza nasıl benzersiz kısıtlama ekleyeceğiniz aşağıda açıklanmıştır. PostgreSQL 9.x kullanıyorsanız aşağıdaki talimatları takip edebilirsiniz.

CREATE UNIQUE INDEX constraint_name ON table_name (columns);

3
Teşekkürler Zeck - güzel 2y sonra cevap ama yine de insanların hala zaman ayırdığınız için teşekkür ederiz! Tom
Thomas Browne

1
Bu doğru değil. Son Postgres gibi iletiye de bu yol açar "Key (Uuid) = (3a533772-07ac-4e76-b577-27a3878e2222) yineleniyor Sorgu başarısız oldu." Benzersiz olmayan bir değer ... varsa
Strinder

3
@Strinder, bu nasıl iyi bir şey değil? önce kopyalanan verileri düzeltin.
Jasen

3
@Jasen Bu tamamen açık. Sadece cevabını vurgulamak istedim "Ama tablonuzda benzersiz olmayan girişleriniz varsa. İşte tablonuza nasıl benzersiz bir kısıtlama ekleyeceğiniz." çalışmayacak. Benzersiz olmayan girişler elbette her zaman önceden birleştirilmelidir.
Strinder

Açıklık cevabını
Xavier Ho

6

Zaten var olan bir kısıtlamaya sahip bir tablonuz varsa şunu söyleyelim: ad ve soyadı ve benzersiz bir kısıt daha eklemek istiyorsanız, tüm kısıtlamayı şu şekilde bırakmanız gerekiyordu:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

Eklemek istediğiniz yeni kısıtlamanın, tablodaki tüm veriler arasında benzersiz / boş (Microsoft Sql, yalnızca bir boş değer içeriyorsa) olduğundan emin olun ve yeniden oluşturabilirsiniz.

ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);

5

Evet, bundan sonra EŞSİZ bir kısıtlama ekleyebilirsiniz. Ancak, tablonuzda benzersiz olmayan girişleriniz varsa, Postgres siz onları düzeltene kadar şikayet edecektir.


7
select <column> from <table> group by 1 having count(*) > 1;yinelenen değerler hakkında bir rapor verecektir.
Jasen
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.