2012-06-13 12 views
7

Veri tabanımdaki bir konu için birden çok adres saklamak için, konu başına yalnızca bir varsayılan adres ile bir yol bulmak istiyorum. İki sütun üzerinde Benzersiz Kısıtlama Postgres: Tamsayı ve Boole

Uzun lafın kısası, biz bir tablo var diyelim: tablodaki her kimliği için

CREATE TABLE test 
(
    id integer NOT NULL, 
    active boolean NOT NULL, 
    CONSTRAINT pk_id PRIMARY KEY (id) 
) 

, en fazla 1 gerçek aktif değer olmalıdır.

Bunu nasıl başarabilirim?

Teşekkürler. @ThiefMaster olarak

create unique index some_index on test (id) where active; 

birincil indeks kaldırılması gerektiğini bildiren:

+0

Aslında * bir şey yapmanıza gerek yok * birincil anahtar olan 'id' onu benzersiz kılar, böylece * aynı kimliği taşıyan iki satır olamaz. – ThiefMaster

+0

Eğer 'id' birincil olarak istemiyorsanız, o zaman bir tetikleyici yazmanız gerekir: http://www.postgresql.org/docs/9.1/static/sql-createtrigger.html ama bu muhtemelen sizin istediğinizi değil. –

cevap

11

Partial index istediğiniz şeydir.

+0

Teşekkürler. Bu iyi, çünkü PK'm bu tablodaki PK adresi. Bu aynı zamanda çalışır: BENZERSİZ DİZİN OLUŞTURMA Bazı_dizin AÇIK test btree KULLANMA (etkin, kimlik) NEREDE aktif; – greatkalu

+0

Sorgunuzda gerçekten değişmiş olan tek şeyin endekse aktif olduğunu eklemelisiniz. Aktif olduğunda her zaman bir alan için indeksleme için bir konu her zaman biraz bloat eklediniz. – kworr

+1

PK, UNIQUE ve NOT NULL kısıtlamalarının sadece bir toplamıdır. – kworr

3

Bu soruda daha önce açıklandığı gibi gerekli değildir.

Fakat FYI, , farklı türlerde 2 veya daha fazla (PrimaryKey olmayan) sütuna kısıtlama getirebilirsiniz. Örneğin:

ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (integer_column, boolean_column); 

fazla bilgi için, Constraints, "Tekil Kısıtlamalar" bölümünde için Postgres belgeye bakın. alıntılarsak:

benzersiz kısıtlama sütun bir grup anlamına gelir, sütunlar ... virgülle ayırarak listelenmektedir

Bu belirtilen sütunlardaki değerlerin kombinasyonu bütün tablo arasında benzersiz olduğunu belirtir

, sütunlardan herhangi biri (ve normalde) benzersiz olmamasına rağmen.

Not: A partial index bambaşka bir amacı vardır bir tablo, bir alt kümesi üzerinde inşa bir dizin ayarlar.

+0

Bence çözümünüzle birden fazla aktif olmayan adresiniz olamaz. – Hossein

İlgili konular