是否可以将postgresql hstorefield(django> = 1.8)添加到模型中,其中hstore中的值是唯一的? 键显然是独一无二的,但值也可以是唯一的吗?我想自定义验证器可以添加到模型中,但我很想知道这是否可以在数据库级别完成
答案 0 :(得分:1)
单个hstore
值可以包含多个key => value
对,从而无法根据唯一索引创建解决方案。此外,您的新hstore
值也可以有多个key => value
对。唯一可行的替代方案就是桌面上的BEFORE INSERT OR UPDATE
触发器:
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();
请注意,这不会捕获表中的现有重复项。