WeBlog

Webに関する情報を中心に発信してるブログ

すでにindex貼られているカラムに対してunique制限をかける方法

内容

すでにindexが付与されているカラムに対してユニーク制約を付与したいと思います。

今回はreset_password_tokenカラムに対してユニーク制約を付与します。

現状

f:id:weblog_tec:20210505222348p:plain

現状だと上記の画像のようにreset_password_tokenカラムのユニーク制約はfalseになっています。

これをtrueに変えます。

しかし、reset_password_tokenカラムはすでにインデックが付与されている状態です。

試したこと

# マイグレーションファイル
class AddIndexResetPasswordTokenToUsers < ActiveRecord::Migration[5.2]
  def change
    add_index :users, :reset_password_token, unique: true
  end
end

# ログ
% rails db:migrate
== 20210425002628 AddIndexResetPasswordTokenToUsers: migrating ================
-- add_index(:users, :reset_password_token, {:unique=>true})
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

Index name 'index_users_on_reset_password_token' on table 'users' already exists

まずは普通にadd_indexを使って、reset_password_tokenカラムにユニーク制約を付与しようとしました。

しかし、マイグレーションファイルを実行すると「Index name 'index_users_on_reset_password_token' on table 'users' already exists」と言うエラーが出ました。

このエラーは、すでにインデックスが付与されているよ。と言うエラーです。

対応

f:id:weblog_tec:20210505222422p:plain

def change
    remove_index :users, :reset_password_token
    add_index :users, :reset_password_token, unique: true
end

そのままindexを付与すると先ほどのようにエラーになるので、まずはindexを削除します。

その後にindexとユニーク制約を付与してあげます。

そうすればユニーク制約を追加することができます。