2013-03-07 27 views
7

Bu anahtar varsa, bir hstore sütunundaki belirli bir anahtarda benzersiz bir dizin veya kısıtlama oluşturmak istiyorum. Cevabın bu diğer söz konusu yerde bulunabilir umuyordum:hstore anahtarında benzersiz dizin veya kısıtlama

Practical limitations of expression indexes in PostgreSQL

Ama ile gelebilir ve hiçbir şey çalışacak sözdizimi her versiyonunu denedik.

anda, benim masa hstore_table

hstore alan

hstore_value ve onlar anahtarları onların var ne zaman benzersiz 'foo' ve 'bar' vardır olmak zorlamak istiyorum olduğunu.

PostgreSQL Benim versiyonu 8.4.13 Seni kısmi benzersiz işlevsel indeksi istediğini doğru sorduğun anlaşılan ettiyseniz

cevap

15

:

CREATE TABLE hstest (x hstore not null); 

CREATE UNIQUE INDEX hstest_key_k1_values_unique 
ON hstest((x -> 'k1')) 
WHERE (x ? 'k1'); 

WHERE fıkra değil Bulunmazsa anahtar arama null olarak kesin olarak gerekli olacaktır. Uygun olup olmadığı sorgunuza bağlı olacaktır. Eğer bunları bağlamak istiyorsanız iki iki ifadeleri bağımsız veya indeks olmak istiyorsanız

Birden anahtarları istiyorsanız

, iki dizinleri kullanmak çok benzersiz kısıtlama (1,2) ve (1,3) veya (izin verir 2,2) ancak başka bir (1,2), şu şekilde değil:

CREATE UNIQUE INDEX hstest_key_k1k2_values_unique 
ON hstest ((x -> 'k1'), (x -> 'k2')); 
+0

MÜKEMMEL BİR İŞLENMİŞTİR! – trex005

+0

Dokümantasyonda "Bir hstore'daki her tuş benzersizdir." Neden gösterdiğiniz endeks türünü eklememiz gerektiğini anlamıyorum. Bir şey mi eksik? – IamIC

+2

@IamIC Orijinal poster, iki farklı A ve B satırı için, hstore alanının 'h', iki satır arasında aynı değere sahip 'k' anahtarını içermediğinden emin olmak istedi. yani eğer satır var ise A.h {k = 1} 'satırında B.h {k = 1}' satırına izin verilmez, ancak 'B.h {k = 2} 'veya' B.h {x = 1} 'ifadesine izin verilir. Bir "UNIQUE" kısıtlaması gibi, ancak bir bütün olarak sütunu değil, hstore anahtarının değerini uygulayarak. –

İlgili konular