LoginSignup
68
55

More than 5 years have passed since last update.

Railsのマイグレーションで複合キーのインデックス

Posted at

Railsのマイグレーションで複合キーのインデックスを貼る作業をした。
対象のRDBMSはMySQLでしかも、複合キーとなるカラムにTEXTがあったので、lengthを指定しなければいけなかった。

SQLで書くとこんな感じ。

ALTER TABLE target_table ADD INDEX additional_idx01(    
    long_text(255)   ,
    saved_on      
)

最初は http://railsdoc.com/migration#%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AE%E8%BF%BD%E5%8A%A0(add_index) で調べていた。

これによると、複合キーの場合のインデックスの追加は

add_index :target_table, [:long_text, :saved_on], :name => 'additional_idx01'

で、いけるらしい。
しかし、これでは長さが指定出来ないので、migrateでSQLエラーが発生する。

ドキュメントでインデックスの長さを指定する例を見てみると

add_index :users, :name, :name => 'by_name', :length => 10

と、書いてある。長さはオプションで指定するらしいのだが、このままだとカラム全体に長さ制限が掛かってしまう。
試しに、以下のように書いてみたがもちろんSQLエラー。

add_index :target_table, [:long_text, :saved_on], :name => 'additional_idx01', :length => 255

散々悩んで、WEBをあさりまくったら、英語圏のブログに解決策を書いているおっさんがいた。感謝感謝。

結局解決した記述。

add_index :target_table, [:long_text, :saved_on], :name => 'additional_idx01', :length => {:long_text => 255}

こんなん想像つくかーーーー!!!!

最初、第2引数に配列が書けるだけでもショックだったのに、オプションの指定で値ではなくハッシュが渡せるなんて。Ruby界隈の人はこれは当たり前なんだろうか。

68
55
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
68
55