【问题标题】:unique index or constraint on hstore keyhstore 键上的唯一索引或约束
【发布时间】:2013-02-22 02:48:01
【问题描述】:

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

Practical limitations of expression indexes in PostgreSQL

但是我尝试了所有我能想到的语法版本,但没有任何效果。

目前,我的桌子是

hstore_table

hstore 字段是 hstore_value

我想强制它们唯一的键是“foo”和“bar”(如果它们存在)。

我的 PostgreSQL 版本是 8.4.13

【问题讨论】:

    标签: postgresql hstore


    【解决方案1】:

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

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

    WHERE 子句不是严格要求的,因为如果未找到密钥查找将为空。是否合适取决于您的查询。

    如果您想要多个键,如果您希望两个索引独立,则使用两个索引,或者如果您想链接两个表达式,则使用两个索引,以便唯一约束允许 (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”。即如果存在行A.h{k=1},则不允许插入行B.h{k=1},但允许插入B.h{k=2}B.h{x=1}。类似于 UNIQUE 约束,但应用于 hstore 键的值,而不是整个列。
    • @CraigRinger 谢谢。这就说得通了。看起来必须在索引定义中指定要约束的每个键。对于大量的键来说是不实用的。我猜在这种情况下,一个 before upsert 触发器会起作用。
    • @IamIC 因为 hstore 有一个 = 运算符,您可能可以使用 hstore 子集运算符 hstore -> text[] 来完成它,但前提是您对固定密钥列表感兴趣并且可以使用 null在那里处理语义。由于 MVCC 可见性规则,插入前触发器将不起作用;您无法使用触发器正确实现 unique 约束。
    猜你喜欢
    • 2018-12-02
    • 2018-06-28
    • 1970-01-01
    • 2015-12-29
    • 2011-03-18
    • 2014-11-28
    • 2017-10-19
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多