使用迁移将字段更改为NOT NULL且使用NULL字段

时间:2015-04-27 08:49:59

标签: ruby-on-rails ruby-on-rails-4

所以我错误地创建了一个表格,其中的字段应该是NOT NULL。

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

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

osascript -e 'if application "Terminal" is frontmost then tell application "System Events" to keystroke "k" using command down'

但这失败并出现错误:

Mysql2 ::错误:无效使用NULL值:ALTER TABLE

有什么想法吗?需要在mysql和sql server上工作..

2 个答案:

答案 0 :(得分:4)

首先确保没有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

选项2:

change_column_null :countries, :effective_date, false, Time.now
change_column_null :countries, :expiry_date, false, Time.new(9999,12,31)

答案 1 :(得分:0)

您可以在添加约束之前为所有NULL列设置默认值,例如:

execute "UPDATE study_sites SET patients_recruited = 0 WHERE patients_recruited IS NULL"
change_column :study_sites, :patients_recruited, :integer, default: 0, null: false