2013-03-07 4 views
7

Vorrei creare un indice univoco o un vincolo su una chiave specifica in una colonna di hstore se tale chiave esiste. Speravo che la risposta sarebbe stata trovata da qualche parte in questa altra domanda:indice univoco o vincolo sul tasto hstore

Practical limitations of expression indexes in PostgreSQL

Ma ho provato tutte le versioni della sintassi ho potuto venire con e niente avrebbe funzionato.

attualmente, il mio tavolo è

hstore_table

campo hstore è hstore_value

e chiavi vorrei forzare per essere unico sono 'foo' e 'bar' quando esistono.

La mia versione di PostgreSQL è 8.4.13

risposta

15

Se ho capito quello che stai chiedendo per bene, si desidera un parziale di indice funzionale unico:

CREATE TABLE hstest (x hstore not null); 

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

La clausola non è WHERE strettamente necessario in quanto la ricerca della chiave sarà nulla se non viene trovata. Se è appropriato dipenderà dalle tue domande.

Se si desidera utilizzare più chiavi, utilizzare due indici se si desidera che i due siano indipendenti o indicizzare due espressioni se si desidera collegarli in modo che il vincolo univoco consenta (1,2) e (1,3) o (2,2), ma non un altro (1,2), come questo:

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

Ha funzionato PERFETTAMENTE! – trex005

+0

La documentazione afferma "Ogni chiave in un hstore è unica." Non capisco perché dovremmo aggiungere il tipo di indice che mostri. Mi sto perdendo qualcosa? – IamIC

+2

@IamIC Il poster originale desiderava garantire che per due diverse righe A e B, il campo h "h" non potesse contenere la stessa chiave "k" con lo stesso valore tra le due righe. Ad esempio, se esiste una riga 'A.h {k = 1}' non consentire l'inserimento della riga 'B.h {k = 1}' ma consentire l'inserimento di 'B.h {k = 2}' o 'B.h {x = 1}'. Come un vincolo "UNICO", ma applicando il valore della chiave dell'hstore, non la colonna nel suo complesso. –