RubyonRails: 如何使用迁移向现有列添加非空约束?

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

63528 次浏览

对于 Rails 4 + ,Nate 的回答(使用 Change _ column _ null)更好。

Pre-Rails 4,尝试 Change _ column

你也可以使用 Change _ column _ null:

change_column_null :table_name, :column_name, false
  1. 添加具有默认值的列

  2. 删除默认值

add_column :orders, :items, :integer, null: false, default: 0
change_column :orders, :items, :integer, default: nil

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

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

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

迁移: 复位

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

如果在简单迁移中只有少量列,则可以使用此方法。