是否可以将 postgresql hstorefield (django >= 1.8) 添加到 hstore 中的值是唯一的模型? 键显然是唯一的,但值也可以是唯一的吗?我想可以将自定义验证器添加到模型中,但我很想知道这是否可以在数据库级别完成
最佳答案
单个 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();
请注意,这不会捕获表中现有的重复项。
关于django - 使用 postgresql 在 django hstorefield 中存储唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32626489/