pgsql 如何强制某些键的唯一性

pgsql how to enforce uniqueness for some keys

我有两张桌子。 table1 是否具有唯一属性

attribute_id     uniqueness 
   1              no
   2             yes
   3             yes

Table 2 有以下数据,组合列 object_id 和 attribute_id 有唯一约束。 现在我需要对值列的另一个唯一约束,因为某些 attribute_id 具有唯一性=是。

就像,attribute_id 2 和 3 在表 1 中具有 unique=yes。它们在 table2 中不能有重复值。

auto_id  object_id   attribute_id    value
  1         1           1             a
  2         2           1             a
  3         1           2             b
  4         2           2             d

我们不能插入 (attribute_id,value)=(2,b) 或 (2,d),如果我们尝试插入 dup 值,它应该通过 error duplicate key value violates unique constraint

我希望我们可以通过触发器来完成,但它会很慢。

寻找更好的方法,请问任何可能的解决方案?

我能想到的具有约束条件的唯一方法是:

  • 也将 uniqueness 列添加到 table2 并用正确的值填充它

  • table1(attribute_id, uniqueness)

    上定义 UNIQUE 约束
  • table2上定义一个外键约束:

    ALTER TABLE table2 ADD FOREIGN KEY (attribute_id, uniqueness)
       REFERENCES table1 (attribute_id, uniqueness);
    
  • table2 上定义部分唯一索引:

    CREATE UNIQUE INDEX ON table2 (attribute_id, value) WHERE uniqueness;
    

当然这会导致数据重复,但是外键会保证不会出现不一致。