2013-03-07 13 views
7

Chciałbym utworzyć unikalny indeks lub ograniczenie dla określonych kluczy w kolumnie hstore, jeśli ten klucz istnieje. Miałam nadzieję, że odpowiedź będzie można znaleźć gdzieś w tej drugiej kwestii:unikalny indeks lub ograniczenie na kluczu hstore

Practical limitations of expression indexes in PostgreSQL

ale próbowałem wszystkich wersji składni mogę wymyślić i nic nie będzie działać.

obecnie mój stół jest

hstore_table

pole hstore jest hstore_value

i klucze Chciałbym wymusić być unikalne są „foo” i „bar” jeśli istnieją.

Moja wersja PostgreSQL to 8.4.13

Odpowiedz

15

Jeśli mam rozumieć, o co prosisz dla poprawnie, chcesz częściową unikatowy indeks funkcjonalne:

CREATE TABLE hstest (x hstore not null); 

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

Klauzula WHERE nie jest ściśle wymagane, ponieważ wyszukiwanie klucza będzie zerowe, jeśli nie zostanie znalezione. To, czy będzie to odpowiednie, zależy od twoich zapytań.

Jeśli chcesz mieć wiele kluczy, użyj dwóch indeksów, jeśli chcesz, aby te dwa były niezależne, lub wpisz dwa wyrażenia, jeśli chcesz je połączyć, aby jednoznaczne ograniczenie zezwalało (1,2) i (1,3) lub (2,2), ale nie inny (1,2), taki jak ten:

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

Pracował PERFEKCYJNIE! – trex005

+0

Dokumentacja stwierdza: "Każdy klucz w hstore jest unikalny." Nie rozumiem, dlaczego potrzebujemy dodać typ wyświetlanego indeksu. Czy czegoś brakuje? – IamIC

+2

@ IamIC Oryginalny plakat chciał upewnić się, że dla dwóch różnych wierszy A i B pole h haseł "h" nie może zawierać tego samego klucza "k" o tej samej wartości między dwoma wierszami. tj. jeśli istnieje wiersz 'A.h {k = 1}' nie zezwalaj na wstawianie wiersza 'B.h {k = 1}', ale zezwól na wstawienie 'B.h {k = 2}' lub 'B.h {x = 1}'. Tak jak ograniczenie "UNIQUE", ale stosując wartość klucza hstore, a nie kolumnę jako całość. –

Powiązane problemy