Edited at

Rails, MySQLでnot null制約のついたtext型のカラムを追加する


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のことが少し嫌いになりました。