向现有 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_onend_on 列时设置默认值(null 除外),然后继续迁移以强制执行 NOT NULL 约束。