向现有 table 添加非空列的问题
Issue with adding a not null columns to an existing table
我在向 table 添加不可为空的列时遇到问题。
我看了很多关于这个的帖子,它应该是正确的。
迁移代码:
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...
我不知道为什么不起作用。我应该如何更正写入更改方法?
提前致谢。
更新:
这是我的大错。我在这个 table 中有一个记录...我清除了 table 并迁移。现在它正在工作。对不起我的愚蠢和浪费你的时间。
我认为这是因为你说 :start_on
不能 null
与此 (explaination here):
change_column_null :individual_trainings, :start_on, false
但你要离开它null
创建列时添加默认值即可:
add_column :individual_trainings, :start_on, :time, default: false
试试这个,
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
如果您的 individual_trainings
table.
中没有任何记录,您的迁移就会成功
由于您的 table 中有记录,当您添加 start_on
列时,列值立即设置为 null
然后您强加 NOT NULL
对它的约束。这就是您收到此错误的原因。
解法:
只需在添加 start_on
或 end_on
列时设置默认值(null 除外),然后继续迁移以强制执行 NOT NULL
约束。
我在向 table 添加不可为空的列时遇到问题。 我看了很多关于这个的帖子,它应该是正确的。
迁移代码:
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...
我不知道为什么不起作用。我应该如何更正写入更改方法?
提前致谢。
更新: 这是我的大错。我在这个 table 中有一个记录...我清除了 table 并迁移。现在它正在工作。对不起我的愚蠢和浪费你的时间。
我认为这是因为你说 :start_on
不能 null
与此 (explaination here):
change_column_null :individual_trainings, :start_on, false
但你要离开它null
创建列时添加默认值即可:
add_column :individual_trainings, :start_on, :time, default: false
试试这个,
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
如果您的 individual_trainings
table.
由于您的 table 中有记录,当您添加 start_on
列时,列值立即设置为 null
然后您强加 NOT NULL
对它的约束。这就是您收到此错误的原因。
解法:
只需在添加 start_on
或 end_on
列时设置默认值(null 除外),然后继续迁移以强制执行 NOT NULL
约束。