2013-03-07 4 views
7

Je souhaite créer un index ou une contrainte unique sur une clé spécifique dans une colonne hstore si cette clé existe. J'espérais la réponse se trouverait quelque part dans cette autre question:index ou contrainte unique sur la clé hstore

Practical limitations of expression indexes in PostgreSQL

Mais j'ai essayé toutes les versions de la syntaxe que je pourrais venir avec et rien ne fonctionne.

actuellement, ma table est

hstore_table

le champ hstore est hstore_value

et ils clés Je voudrais forcer à être unique sont 'foo' et 'bar' lorsqu'ils existent.

Ma version de PostgreSQL est 8.4.13

Répondre

15

Si je comprends ce que vous vous demandez bien, vous voulez un indice fonctionnel unique, partiel:

CREATE TABLE hstest (x hstore not null); 

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

La clause WHERE n'est pas strictement requis car la recherche de clé sera nulle si elle n'est pas trouvée. Que ce soit approprié dépendra de vos requêtes.

Si vous voulez plusieurs clés, utilisez deux index si vous voulez que les deux soient indépendants, ou indexez deux expressions si vous voulez les lier afin que la contrainte unique permette (1,2) et (1,3) ou (2,2) mais pas un autre (1,2), comme ceci:

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

A travaillé PARFAITEMENT! – trex005

+0

La documentation indique "Chaque clé dans un hstore est unique." Je ne comprends pas pourquoi nous aurions besoin d'ajouter le type d'index que vous montrez. Est-ce que je manque quelque chose? – IamIC

+2

@IamIC L'affiche originale voulait s'assurer que pour deux lignes A et B différentes, le champ hstore 'h' ne pouvait pas contenir la même clé 'k' avec la même valeur entre les deux lignes. c'est-à-dire s'il existe une rangée 'A.h {k = 1}' interdire l'insertion de la rangée 'B.h {k = 1}' mais autoriser l'insertion de 'B.h {k = 2}' ou 'B.h {x = 1}'. Comme une contrainte 'UNIQUE', mais en appliquant sur la valeur de la clé hstore, pas la colonne dans son ensemble. –

Questions connexes