Postgresql hstore键上的唯一索引或约束

Postgresql hstore键上的唯一索引或约束,postgresql,hstore,Postgresql,Hstore,我想在hstore列中的特定键上创建唯一索引或约束(如果该键存在)。我希望能在另一个问题中找到答案: 但我尝试了我能想到的每一种语法版本,但没有任何效果 目前,我的桌子是 hstore_表 hstore字段是hstore_值 我想强制它们成为唯一的键是“foo”和“bar” 我的PostgreSQL版本是8.4.13如果我正确理解了您的要求,您需要一个部分唯一的功能索引: CREATE TABLE hstest ( x hstore not null ); CREATE UNIQUE IND

我想在hstore列中的特定键上创建唯一索引或约束(如果该键存在)。我希望能在另一个问题中找到答案:

但我尝试了我能想到的每一种语法版本,但没有任何效果

目前,我的桌子是

hstore_表

hstore字段是hstore_值

我想强制它们成为唯一的键是“foo”和“bar”


我的PostgreSQL版本是8.4.13

如果我正确理解了您的要求,您需要一个部分唯一的功能索引:

CREATE TABLE hstest ( x hstore not null );

CREATE UNIQUE INDEX hstest_key_k1_values_unique 
ON hstest((x -> 'k1'))
WHERE ( x ? 'k1' );
WHERE
子句不是严格要求的,因为如果找不到,则键查找将为null。这是否合适将取决于您的查询

如果需要多个键,如果希望两个键独立,请使用两个索引;如果希望链接两个表达式,请使用两个索引,以便唯一约束允许(1,2)和(1,3)或(2,2),但不允许另一个(1,2),如下所示:

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

文档声明“hstore中的每个键都是唯一的。”我不明白为什么我们需要添加您显示的索引类型。我遗漏了什么吗?@IamIC原始海报希望确保对于两个不同的行A和B,hstore字段“h”不能包含两行之间具有相同值的相同键“k”。i、 e.如果存在行
A.h{k=1}
则不允许插入行
B.h{k=1}
,但允许插入
B.h{k=2}
B.h{x=1}
。类似于
唯一的
约束,但应用于hstore键的值,而不是整个列。@CraigRinger谢谢。这是有道理的。看起来必须在索引定义中指定要约束的每个键。对于大量的钥匙来说是不实用的。我想在这种情况下,“插入前”触发器可能会起作用。@IamIC因为hstore有一个
=
操作符,您可能可以使用hstore子集操作符
hstore->text[]
来完成它,但前提是您对固定键列表感兴趣,并且对其中的空处理语义没有问题。由于MVCC可见性规则,插入前触发器无法工作;无法使用触发器正确实现
唯一的
约束。