使用迁移将字段更改为带有NULL字段的NOT NULL

use*_*721 3 ruby-on-rails ruby-on-rails-4

所以我错误地创建了一个表,该表的字段本来应该不是NULL。

我需要创建一个迁移,以将字段从NULLABLE更改为NOT NULL,但是存在一些已经为NULL的行。

我可以更新这些行并更改字段吗?我尝试了这个:

  def change
    change_column :countries, :effective_date, :date, :null => false, :default => Time.now
    change_column :countries, :expiry_date, :date, :null => false, :default => Time.new(9999,12,31)
  end
Run Code Online (Sandbox Code Playgroud)

但这失败并出现错误:

Mysql2 :: Error:无效使用NULL值:ALTER TABLE

有任何想法吗?需要同时在mysql和sql服务器上工作。

mak*_*han 5

首先确保没有NULL,然后更改约束。

选项1:

Country.where(effective_date: nil).update_all(effective_date: Time.now)
Country.where(expiry_date: nil).update_all(expiry_date: Time.new(9999,12,31))
change_column :countries, :effective_date, :date, :null => false
change_column :countries, :expiry_date, :date, :null => false
Run Code Online (Sandbox Code Playgroud)

选项2:

change_column_null :countries, :effective_date, false, Time.now
change_column_null :countries, :expiry_date, false, Time.new(9999,12,31)
Run Code Online (Sandbox Code Playgroud)