我在向表中添加不可为空的列时遇到问题。 我读了很多关于这个的帖子,它应该是正确的。
迁移代码:
def change
add_column :individual_trainings, :start_on, :time
add_column :individual_trainings, :end_on, :time
change_column_null :individual_trainings, :start_on, false
change_column_null :individual_trainings, :end_on, false
end
错误:
PG::NotNullViolation: ERROR: column "start_on" contains null values...
我不知道为什么没有工作。我该如何纠正写改变方法?
提前致谢。
更新: 这是我的大错。我在这张桌子上有一条记录......我清理桌子并迁移。现在它正在运作。对不起我的愚蠢和浪费你的时间。
答案 0 :(得分:10)
如果individual_trainings
表中没有任何记录,您的迁移就会有效。
由于您的表中有记录,因此当您添加start_on
列时,立即将列值设置为null
,然后对其施加NOT NULL
约束。这就是您收到此错误的原因。
<强>解决方案:强>
添加start_on
或end_on
列时,只需设置默认值(null除外),然后继续迁移以强制执行NOT NULL
约束。
答案 1 :(得分:4)
我认为这是因为你说:start_on
不能null
这个(explaination here):
change_column_null :individual_trainings, :start_on, false
但你要离开它null
创建列时添加默认值,并且没问题:
add_column :individual_trainings, :start_on, :time, default: false
答案 2 :(得分:1)
试试这个,
def change
change_column_default :individual_trainings, :start_on, Time.now
change_column_default :individual_trainings, :end_on, Time.now
end
有关详细信息,请参阅http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_column_default
要设置非空约束,请执行此操作
def change
change_column :individual_trainings, :start_on, :time, :null => false
change_column :individual_trainings, :end_on, :time, :null => false
end