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;
当然这会导致数据重复,但是外键会保证不会出现不一致。
我有两张桌子。 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;
当然这会导致数据重复,但是外键会保证不会出现不一致。