LoginSignup
6
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2017-10-06

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

6
4
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
6
4