2011-02-03

rake db:migrateは成功しているのにindexが作られない

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
DBがmysqlで以下のような感じのmigrationを作りました。
create_table :hogehoge_mogemoges do |t|
  t.column :ahaha_id, :integer
  t.column :ihihi_id, :integer
  t.column :uhuhu_id, :integer
  t.column :ehehe_id, :integer
  t.column :ohoho_id, :integer
  t.column :valval,   :string
end
add_index :hogehoge_mogemoges,[:ahaha_id,:uhuhu_id,:ohoho_id],:unique => true

rake db:migrate
は普通に成功したのですが、indexが作成されていませんでした。

indexが作成されない理由は、作成されるindex名に原因があります。
この場合は、
index_hogehoge_mogemmoges_on_ahaha_id_and_ihihi_id_and_uhuhu_id_and_ehehe_id_and_ohoho_id
という名前のインデックスを作成をすることになります。

mysqlに直接、このインデックスを作成しようとすると

ERROR 1059 (42000): Identifier name 'index_hogehoge_mogemmoges_on_ahaha_id_and_ihihi_id_and_uhuhu_id_and_ehehe_id_and_ohoho_id' is too long
とエラーが出てて作れません。

たしかにtoo longです。
mysqlでは、インデックスに使えるのは最大64文字のようです。

でこれを解決するには、以下のようにadd_indexで名前を渡せばよいだけです。
add_index :hogehoge_mogemoges,[:ahaha_id,:uhuhu_id,:ohoho_id],{:unique => true, :name =>
"ind_hogemoge_aiueo"}

コメントを投稿