如何有条件地添加索引

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何有条件地添加索引相关的知识,希望对你有一定的参考价值。

说我有一个模特

class Post < ActiveRecord::Base
  validates_uniqueness_of :title, :unless => Proc.new {|p| p.deleted?}
end

约束是我可以只有一个帖子有“foobar”作为标题而它没有被删除,1个帖子都被删除为真,也有“foobar”作为他们的标题。由于ActiveRecord无法保证this link标题的唯一性,我试图在表帖子上添加一个唯一索引,在列[:title,:deleted]上,当我尝试插入新的删除时,它将失败发布到数据库。

答案

这在postgresql中是可能的

add_index :table_name, :columns, unique: true, where: "(deleted_at IS NULL)"
另一答案

大多数数据库都不可能有条件数据库索引,例如mysql的。

如果您绝对必须保证唯一性,那么最好的选择可能是单独删除帖子表。您在主表上有唯一索引,但在包含已删除记录的表上没有。您最终会得到一个较小的帖子表和更简单的编码 - 不再需要在任何查询中过滤掉已删除的帖子。

您是否考虑过如果您取消删除帖子会发生什么 - 两个帖子可以有相同的标题吗?

其他一些选择是:

  1. 删除帖子时更改标题,例如添加时间戳
  2. 如果可以找到2个或更多相同标题的实例,则在保存模型后引发异常。
  3. 在保存之前锁定整个表(悲观锁定)。
  4. 只是希望它有效(你有多少时间让两个人在同一时间发布相同的标题?)

以上是关于如何有条件地添加索引的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将多个片段添加到片段过渡?

条件片段和导航重用

如何在 Vue 中有条件地添加一个类?

Laravel 5.8 有条件地插入 sql 片段

有条件地导入 python 类的片段

如何有条件地添加垫升按钮?