instant か start_date, end_date の二つのどちらかにだけ値が入るモデルがあって、こんな index を作ってたんですが、
.rb
add_index :foos, [:name, :instant, :start_date, :end_date], unique: true
これではnilがDB上ではそれぞれ異なる値として処理されるために unique 制限が全く働いてくれませんでした。
対策
whereを使ってpartial indexを作り対策しましょう。
add_index :foos, [:name, :start_date, :end_date], unique: true, where: 'instant IS NULL'
add_index :foos, [:name, :instant], unique: true, where: 'start_date IS NULL and end_date IS NULL'
参考