Railsのマイグレーションでデータベースのテーブルにカラムを追加するとき、任意の位置にカラムを追加することは可能でしょうか?


可能な場合、どのようなマイグレーションのコードを書けばよいか教えて頂けないでしょうか。よろしくお願いします。

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2009/10/31 06:48:14
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント100pt

RubyやRails側ではなく、データベース側の制約になりますので、

残念ながら末尾にしか追加出来ません。


後からカラムを追加した場合の表示順変更等は、

フロントエンド(今回であればRuby)側で対処する必要があります。


どうしてもということであれば、新規にテーブルを作成して、

旧テーブルからインポートすれば望みの並びになりますが・・・

整合性問題などもあり、かなり面倒なことになると思いますよ。

id:tyn

kn1967さん、回答有難うございます。

http://www.programming-magic.com/20071004015528/ ここのページを見るとMySQLにはカラムを追加する位置を指定するクエリーが存在するようなのですが、

executeを使ってSQLを直接指定すれば可能になるのでしょうか?

新しくテーブルを作りなおすのはとても大変そうで、躊躇してしまいそうです。

2009/10/24 13:20:56
  • id:Mook
    Rails とは関係ない話ですし、使用するデータベースに依存しますが、
    例えば MySQL でしたら列の追加時にオプションで挿入位置を指定できます。
    http://dev.mysql.com/doc/refman/5.1/ja/alter-table.html
    http://plaza.rakuten.co.jp/hknopage/diary/200906130003/
  • id:tyn
    コメント有難うございます。
    多用することはないと思うのですが、抜け道はあるのかなと思いまして。
    ご指摘の通り、Railsを利用する必要はなかったですね。
  • id:kn1967
    >SQLを直接指定すれば

    一時避難的にDBを直接操作ってのも致し方ない場面があったりはしますが、
    そのような対応をしていると、データベース上の整合性だけでなく、
    プログラム側との整合性も・・・。

    Railsのようなものを使う意義が減るとも思いますが・・・。
  • id:kn1967
    言葉足らずかなと思ってコメント書き直しをしたので、
    コメントが前後しちゃいましたね。スミマセン。
  • id:tyn
    コメント頂けてとても有難いです。
    データベースを使うのは初めてでよく分からなかったのですが、
    プログラム側との整合性とはどういうものを指すのでしょうか。
  • id:kn1967
    カラムの並び順にこだわらなければならないような、
    何か変わったプログラムの書き方でもあるのかな?
    などと思ったもので・・・。
  • id:chuken_kenkou
    MySQLでは、ALTER TABLEで列の追加位置を指定できます。

    しかし、これをどのように実装しているかというと、内部的にDROP TABLEとCREATE TABLEが行われます。
  • id:tyn
    kn1967さん、実はまだ殆どプログラム書いていません(^^;

    chuken_kenkouさん、コメントありがとうございます。結局テーブルに登録したデータはなくなってしまうんですね。
    実行する前に知ることができてよかったです。
  • id:kn1967
    プログラムはこれからということであれば、
    一時的措置として直接SQL投げてもいいかもしれません。

    でも、他の質問の事もあるので、もう少しデータベースの設計を行って、
    Ruby側では何をさせるかという点についても設計と資料収集を行い、
    それから改めて製作にかかるという流れのほうが良いように思います。

    id:chuken_kenkouさん
    > 内部的にDROP TABLEとCREATE TABLEが行われます
    「新規にテーブルを作成して、旧テーブルからインポート」に対するものだと思いますが、
    内部的に行う場合と、外部から行う場合を同一と勘違いさせかねませんし、
    そもそも「その順序で処理が行われている」という誤解を招いているようですよ。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません