Ruby on rails 使用迁移将字段更改为非空,并使用空字段
因此,我错误地创建了一个表,其中的字段本应不为NULL 我需要创建一个迁移,将字段从NULL改为notnull,但是存在一些已经为NULL的行 我可以更新这些行并更改字段吗?我试过这个:Ruby on rails 使用迁移将字段更改为非空,并使用空字段,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,因此,我错误地创建了一个表,其中的字段本应不为NULL 我需要创建一个迁移,将字段从NULL改为notnull,但是存在一些已经为NULL的行 我可以更新这些行并更改字段吗?我试过这个: def change change_column :countries, :effective_date, :date, :null => false, :default => Time.now change_column :countries, :expiry_date, :d
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
但这失败了,出现了一个错误:
Mysql2::错误:无效使用空值:ALTER TABLE
有什么想法吗?需要同时在mysql和sql server上工作。首先确保没有空值,然后更改约束 备选案文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
备选案文2:
change_column_null :countries, :effective_date, false, Time.now
change_column_null :countries, :expiry_date, false, Time.new(9999,12,31)
可以在添加约束之前为所有空列设置默认值,例如:
execute "UPDATE study_sites SET patients_recruited = 0 WHERE patients_recruited IS NULL"
change_column :study_sites, :patients_recruited, :integer, default: 0, null: false
put:null=>false在默认值之后,检查它是否工作。仍然得到相同的错误!请查看链接第一种方法给出了错误:参数数目错误(2代表1)C:“update_all”中的。我相信这在Rails4中是不推荐的。据我所知,第二种方法不适用于SQL server。我相信你说的第一种方法在rails 4中被弃用是对的。为什么你认为第二条路行不通?您可以在迁移中执行rails中可以执行的所有操作。顺便说一句,我检查了change\u column\u null的文档,它接受了可选的第4个参数,我用它更新了答案。JRuby和SQL Server组合不支持该change\u column\u null。因此,当我们在那个环境中运行迁移时,迁移实际上失败了。有趣的是,我不知道这一点。你试过1和2的组合吗?用选项1更新了答案。顺便说一句,SQLServer适配器实现了
change\u column\u null
方法。您收到的错误消息是什么?