141

在我的 Rails (3.2) 应用程序中,我的数据库中有一堆表,但我忘记添加一些非空约束。如何编写向现有列添加非空值的迁移?

4

5 回答 5

293

您还可以使用change_column_null

change_column_null :table_name, :column_name, false
于 2013-11-28T00:24:16.913 回答
96

对于 Rails 4+,nates 的回答(使用change_column_null)更好。

在 Rails 4 之前,尝试change_column

于 2012-02-15T00:25:05.813 回答
12
  1. 添加具有默认值的列

  2. 删除默认值

add_column :orders, :items, :integer, null: false, default: 0
change_column :orders, :items, :integer, default: nil
于 2016-05-06T14:03:14.137 回答
3

如果您在新的创建迁移脚本/模式上使用它,我们可以在这里定义它

class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
    t.string :name, null: false     # Notice here, NOT NULL definition
    t.string :email, null: false
    t.string :password, null: false
    t.integer :created_by
    t.integer :updated_by 

    t.datetime :created_at
    t.datetime :updated_at, default: -> { 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' }
   end
  end
end
于 2018-07-30T14:55:35.023 回答
0

在我的方法中,我将 NOT NULL 约束添加到我现有迁移迁移中需要的列。之后,我使用以下命令重置所有迁移:

耙分贝:迁移:重置

这将删除数据库,再次创建它并运行所有迁移。您可以在 schema.rb 中检查您的更改。

如果您在简单迁移中的列数很少,则可以使用这种方法。

于 2021-04-21T07:40:48.460 回答