instant
か start_date
, end_date
の二つのどちらかにだけ値が入るモデルがあって、こんな index を作ってたんですが、
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'