使用postgresql在django hstorefield中存储唯一值
是否可以将postgresql hstorefield(django>=1.8)添加到hstore中的值唯一的模型中?使用postgresql在django hstorefield中存储唯一值,django,postgresql,Django,Postgresql,是否可以将postgresql hstorefield(django>=1.8)添加到hstore中的值唯一的模型中? 键显然是唯一的,但值也可以是唯一的吗?我想可以将自定义验证器添加到模型中,但我想知道这是否可以在数据库级别上完成单个hstore值可以包含多个键=>值对,这使得基于唯一索引的解决方案不可能实现。此外,新的hstore值也可以有多个key=>value对。唯一可行的替代方法是在表上插入或更新之前使用: CREATE FUNCTION trf_uniq_hstore_values(
键显然是唯一的,但值也可以是唯一的吗?我想可以将自定义验证器添加到模型中,但我想知道这是否可以在数据库级别上完成单个
hstore
值可以包含多个键=>值
对,这使得基于唯一索引的解决方案不可能实现。此外,新的hstore
值也可以有多个key=>value
对。唯一可行的替代方法是在表上插入或更新之前使用:
CREATE FUNCTION trf_uniq_hstore_values() RETURNS trigger AS $$
DECLARE
dups text;
BEGIN
SELECT string_agg(x, ',') INTO dups
FROM (SELECT svals(hstorefield) AS x FROM my_table) sub
JOIN (SELECT svals(NEW.hstorefield) AS x) vals USING (x);
IF dups IS NOT NULL THEN
RAISE NOTICE format('Value(s) %s violate(s) uniqueness constraint. Operation aborted.', dups);
RETURN NULL;
ELSE
RETURN NEW;
END IF;
END; $$ LANGUAGE plpgsql;
CREATE TRIGGER tr_uniq_hstore_values
BEFORE INSERT OR UPDATE ON my_table
FOR EACH ROW EXECUTE PROCEDURE trf_uniq_hstore_values();
请注意,这不会在表中捕获现有的重复项。我现在明白了为什么这是不可能的,因为在关系模型中,键值对没有相同的权限是常规字段。提供的解决方案很好,但我更愿意使用ORM在Python中进行验证,因为编写/维护这样的代码对我来说更容易,即使从性能角度看,在DB级别上做更好。谢谢您如果您还添加了一个检查
约束以防止在单个hs存储
字段中出现该键的多个实例,则可以使用唯一
表达式索引。为此,请定义“唯一”。这组值是唯一的吗?键/值组合集是否唯一?某个特定键的值是否唯一?请举例说明哪些是应该允许的,哪些是不应该允许的。编辑问题,完成后在此处发表评论。