【问题标题】:Issue with adding a not null columns to an existing table向现有表添加非空列的问题
【发布时间】:2016-05-10 11:03:21
【问题描述】:

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

迁移代码:

  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...

我不知道为什么不起作用。我应该如何更正写更改方法?

提前致谢。

更新: 这是我的大错。我在此表中有一条记录...我清除了表并迁移。现在它正在工作。对不起,我的愚蠢和浪费你的时间。

【问题讨论】:

  • 我不完全了解你的情况,但你可以使用这个add_column :individual_trainings, :start_on, :time, default: false 试试它是否有效
  • 我最近写了一个迁移来做你所做的。但就我而言,我删除了所有具有空值的记录。因为从现在开始,我们的数据库不应该接受空值。你能删除这些带有空值的记录吗?
  • @AdrianoTadao 我在这个表中没有任何记录。
  • 你试过这样的事情吗? change_column :individual_trainings, :start_on, :datetime, null: false 没有记录就很奇怪了。你确定吗?您可以通过postico 或 psql 查看吗?也许你有一些隐藏的记录,我不知道。 xD

标签: ruby-on-rails ruby postgresql rails-migrations


【解决方案1】:

如果您的 individual_trainings 表中没有任何记录,您的迁移就会成功。

由于您的表中有记录,当您添加start_on 列时,列值立即设置为null,然后您对其施加NOT NULL 约束。这就是您收到此错误的原因。

解决方案:

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

【讨论】:

    【解决方案2】:

    我认为这是因为您说:start_on不能是null 与此(explaination here):

    change_column_null :individual_trainings, :start_on, false

    但你要离开它null

    创建列的时候加个默认值就好了:

    add_column :individual_trainings, :start_on, :time, default: false
    

    【讨论】:

      【解决方案3】:

      试试这个,

       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
      

      【讨论】:

      • 如果我尝试你的建议,我有这个错误: ActiveRecord::StatementInvalid: PG::InvalidDatetimeFormat: 错误:类型时间的无效输入语法:“f”:ALTER TABLE "individual_trainings" ALTER COLUMN "start_on " 设置默认值'f'
      • 因为time 类型,您为此使用了time 数据类型。所以你必须将current date 设置为默认值。查看更新的代码。
      • 不完全是,因为我想为列设置不为空,而不是默认值。
      • 是的,默认值是另一回事。你的错误很奇怪。 @ŁukaszKorol 请告诉我们你是如何解决这个问题的。
      • 这是我的大错。我在此表中有一条记录...我清除了表并迁移。现在它正在工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 2014-06-21
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多