Railsアプリでのマイグレーションエラーまとめ

概要

Railsアプリでmigrateする際のエラーの対処をまとめる。

エラー対処

Mysql2::Error: Duplicate column name 【カラム名

カラムが重複してるからmigrateできないという意味

原因

ブランチを行き来したことで起こったのですが、原因は分かっていません。分かり次第、更新します!

エラー解決

1. 重複しているカラムを保存しようとしているマイグレーションファイルを見つける。

  class AddCoulmnToOrganizationKeywords < ActiveRecord::Migration[6.1]
    def change
      add_column :users, :name, :string
    end
  end

2. そのマイグレーションファイルの中身をchangeメソッドを空にする。

  class AddCoulmnToOrganizationKeywords < ActiveRecord::Migration[6.1]
    def change
      # 空にする
    end
  end

Mysql2::Error: Can't DROP 【インデックス名】; check that column/key exists

【インデックス名】が削除できないから、カラム等を確認してほしいという意味

原因

エラー解決

1. エラーが起こった【インデックス名】で活用しているカラムを持つマイグレーションファイルをmigrateする。

rails db:migrate VERSION=【マイグレーションID】

2. 1.のマイグレーションファイルに依存したマイグレーションファイルを先にロールバックする。

rails db:migrate:down VERSION=【マイグレーションID】

3. 1.のマイグレーションファイルをロールバックする。

Mysql2::Error: Table 【テーブル名】 doesn't exist

【テーブル名】が存在しませんという意味

原因

エラー解決

1. エラーが起こった【テーブル名】を持つマイグレーションファイルをmigrateする。

rails db:migrate VERSION=【マイグレーションID】

2. 1.のマイグレーションファイルに依存したマイグレーションファイルを先にロールバックする。

rails db:migrate:down VERSION=【マイグレーションID】

3. 1.のマイグレーションファイルをロールバックする。

Index name 【インデックス名】 on table 【テーブル名】 is too long; the limit is 64 characters

【テーブル名】の中の【インデックス名】が長過ぎるから64文字までに抑えてという意味

原因

    class CreateTableAs < ActiveRecord::Migration[6.1]
      def change
        create_table :table_a do |t|
          t.references :table_b
        end
      end
    end
  
  • rails db migrateを行う。
  • t.references で知らない内にインデックスが作成されようとする。(今回の場合は、index_table_a_on_table_b_idが作成される。)
  • インデックス名が64文字以上あり、エラーで弾かれる。

エラー解決①

t.referencesにindexオプションを付与し、インデックス名を指定する。

  class CreateTableAs < ActiveRecord::Migration[6.1]
    def change
      create_table :table_a do |t|
        t.references :table_b, index: { name: 'idx_table_a_on_table_b_id' }
      end
    end
  end

エラー解決②

t.referencesにindexオプションを付与し、falseを指定する。

  class CreateTableAs < ActiveRecord::Migration[6.1]
    def change
      create_table :table_a do |t|
        t.references :table_b, index: false
      end
    end
  end

最後に

改めて今回まとめた事でどういうものが出力できるか理解できました。どこか間違っている所があれば指摘して頂けると嬉しいです。
ここまで読んで下さりありがとうございました〜

参考資料