【问题标题】:How do I enforce set-like uniqueness between multiple columns? [duplicate]如何在多列之间强制执行类似集合的唯一性? [复制]
【发布时间】:2012-11-06 00:12:44
【问题描述】:

我不确定我是否正确地表达了这个问题,所以我会尝试更长的解释。我有这种表:

CREATE TABLE x (a int, b int);

我想认为 (a,b) 对与 (b,a) 相同,并且不允许插入重复项。如果 PostgreSQL 有 set 数据类型,我可能会这样声明表:

CREATE TABLE x (
    ab set,
    UNIQUE (ab)
);

但事实并非如此,那么最好的方法是什么?

【问题讨论】:

    标签: sql postgresql unique-constraint


    【解决方案1】:
    create unique index idx_unique_ab 
        on x (least(a,b), greatest(a,b));
    

    【讨论】:

      【解决方案2】:

      我只是强制一对只能以一种方式存储,然后创建一个常规的唯一约束。

      CREATE TABLE x
        (
           a INT,
           b INT,
           CHECK (a < b),
           UNIQUE(a, b)
        ); 
      

      【讨论】:

      • 不幸的是,这将阻止对 (2,1) 的初始插入,这不违反规则。
      • @ji6 - 规则表明 (2,1) 在语义上等同于 (1,2) 并且选择是在插入时对其进行排序,以便插入确保使用一致的格式(可以使用触发器)或按照其他答案以这种格式存储数据的冗余副本。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-04
      • 1970-01-01
      相关资源
      最近更新 更多