MySQLではtext型にdefault値を設定できない問題
既存のテーブルに対し、not null制約のついたカラムを追加したい場合、一般的には、
class AddColumnToArticles < ActiveRecord::Migration
def change
add_column :articles, :memo, :string, null: false, default: ''
end
end
のように、default値を設定してあげればよいわけですが、MySQLではtext, blob型にはdefault値を与えることができません。(エラーになります。)
# エラー
class AddColumnToArticles < ActiveRecord::Migration
def change
add_column :articles, :memo, :text, null: false, default: ''
end
end
ひょっとして、と思って一回string型経由ならいけるかと思いましたが、ダメでした。
(null: false
のように書かないとdefault値がなくなると思っていたのですが、勘違いでした。そして、defaultを取り消すのは結構大変っぽい。)
# これもエラー
class AddColumnToArticles < ActiveRecord::Migration
def up
add_column :articles, :memo, :string, default: '', null: false
change_column :articles, :memo, :string # null: falseはなくなるが、default: ''はそのまま
change_column :articles, :memo, :text, null: false
end
end
解決
結局、SQLを実行して、無理やり空文字をつっこみました。
class AddColumnToArticles < ActiveRecord::Migration
def up
add_column :articles, :memo, :text
execute <<-SQL
UPDATE articles SET memo = '' WHERE memo IS NULL;
SQL
change_column :articles, :memo, :text, null: false
end
end
感想
正直邪道な気がします。もっといいやり方があれば教えてください。
MySQLのことが少し嫌いになりました。