向现有表添加非空列的问题

Pre*_*asz 5 ruby postgresql ruby-on-rails rails-migrations

我在向表中添加不可为空的列时遇到问题.我读了很多关于这个的帖子,它应该是正确的.

迁移代码:

  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
Run Code Online (Sandbox Code Playgroud)

错误:

PG::NotNullViolation: ERROR:  column "start_on" contains null values...
Run Code Online (Sandbox Code Playgroud)

我不知道为什么不工作.我该如何纠正写改变方法?

提前致谢.

更新:这是我的大错.我在这张桌子上有一条记录......我清理桌子并迁移.现在它正在运作.对不起我的愚蠢和浪费你的时间.

dp7*_*dp7 11

如果您的individual_trainings表中没有任何记录,您的迁移将起作用.

由于表中有记录,因此在添加start_on列时,会立即将列值设置为null,然后对其施加NOT NULL约束.这就是你得到这个错误的原因.

解:

只需在添加start_onend_on列时设置默认值(null除外),然后继续执行迁移以强制执行NOT NULL约束.


cia*_*ben 5

我认为这是因为你说:start_on不能null用这个(解释here):

change_column_null :individual_trainings, :start_on, false

但你要离开它 null

在创建列时添加一个默认值就可以了:

add_column :individual_trainings, :start_on, :time, default: false
Run Code Online (Sandbox Code Playgroud)