hstore密钥的唯一索引或约束

tre*_*005 8 postgresql hstore

如果该密钥存在,我想在hstore列中的特定键上创建唯一索引或约束.我希望在另一个问题的某处可以找到答案:

PostgreSQL中表达式索引的实际限制

但我尝试了我能提出的每个版本的语法,没有任何方法可行.

目前,我的表是

hstore_table

hstore字段是hstore_value

当它们存在时,我想要强制独特的是'foo'和'bar'.

我的PostgreSQL版本是8.4.13

Cra*_*ger 16

如果我已经理解了你正确要求的东西,你需要一个部分独特的功能索引:

CREATE TABLE hstest ( x hstore not null );

CREATE UNIQUE INDEX hstest_key_k1_values_unique 
ON hstest((x -> 'k1'))
WHERE ( x ? 'k1' );
Run Code Online (Sandbox Code Playgroud)

WHERE子句不是严格要求的,因为如果找不到,则键查找将为null.它是否合适取决于您的查询.

如果你想要多个键,如果你想要两个键是独立的,可以使用两个索引;如果你想链接它们,请使用索引两个表达式,这样唯一约束允许(1,2)和(1,3)或(2,2)但不是另一个(1,2),像这样:

CREATE UNIQUE INDEX hstest_key_k1k2_values_unique 
ON hstest ((x -> 'k1'), (x -> 'k2'));
Run Code Online (Sandbox Code Playgroud)

  • @IamIC原始海报希望确保对于两个不同的行A和B,hstore字段'h'不能包含两行之间具有相同值的相同键'k'.即如果存在行'Ah {k = 1}`不允许插入行'Bh {k = 1}`但允许插入`Bh {k = 2}`或'Bh {x = 1}`.像`UNIQUE`约束,但是应用hstore键的值,而不是整个列. (2认同)