我有一个数组列,它是rails中唯一验证的一部分。
这是一个包含a,b,c,d,e。
列的表格验证: validates_uniqueness_of:d,范围:[:a,:b]
现在因为我有多个rails服务器,所以表中有时会有重复的行,因为没有DB级别的约束。更多信息:http://robots.thoughtbot.com/the-perils-of-uniqueness-validations/
所以, 我试图在表上添加一个唯一的索引,如下所示: add_index:table,[“a”,“b”,“d”],唯一:true,使用:: gin
我正在使用杜松子酒。看到 http://www.postgresql.org/docs/current/static/gin-intro.html Can PostgreSQL index array columns?
然而,
在执行db:migrate之后,我仍然可以添加重复的行。我假设这是因为数组上的唯一索引不起作用。
任何指针?
谢谢!
答案 0 :(得分:1)
最好我知道,Postgres只会使用btree索引强制执行唯一约束。因此,您的索引创建代码要么默默地失败,要么默默地忽略其定义的唯一部分。
另一个要考虑的问题是array[1,2,3] <> array[3,2,1]
就Postgres而言。为了确保正确的唯一性验证,您可能还希望对数组强制执行约束,以便拒绝未排序的值。
(更好的是,你应该正确地规范你的数据,以避免使用这样的数组开始,但我离题......这完全是另一个话题。)