一意性制約の外し方

前置き

Railsアプリの作成中に一意性制約の外し方がわからなくなりました。

いつも通り、自分用のメモとして残しておきます。

結論

新しいマイグレーションファイルを作成し、indexの削除を行う。

これだけです。

 

手順は以下の通り

 

まずはマイグレーションファイルを作成します。

@ターミナル

rails g migration RemoveNameIndexFromMenu

ファイル名はなんでも大丈夫です。

今回はmenusテーブルのnameカラムから一意性制約を外したかったので、上記のファイル名にしました。

 

次に、ファイルを編集します。

class DeleteNameIndexFromMenu < ActiveRecord::Migration[6.0]
  def change
    remove_index :menus, :name
  end
end

1, 5行目は最初から書かれているので、2 ~ 4行目(下線部)を追加してください。

 

最後にマイグレーションをすれば完了です。

 

補足

上記の作業で一意性制約が外れる理由について補足しておきます。

これは、そもそも一意性制約の設定にindexが必要だから、になります。

 

一意性制約を設定した際のマイグレーションファイルを見てみると、次のようになっています。

class AddIndexMenusName < ActiveRecord::Migration[6.0]
  def change
    add_index :menus, :name, unique: true
  end
end

rails ではまずindexを作り、そこでオプションとして一意性制約をかけているというわけですね。

なので、土台となっているindexがなくなってしまえば制約もまとめて消えてしまうというわけです。