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

Dav*_*son 124 database migration ruby-on-rails constraints notnull

在我的Rails(3.2)应用程序中,我的数据库中有一堆表,但我忘了添加一些非空约束.我已经google了但我找不到如何编写一个向现有列添加非null的迁移.

TIA.

nat*_*tes 258

你也可以使用change_column_null:

change_column_null :table_name, :column_name, false
Run Code Online (Sandbox Code Playgroud)

  • 最干净的答案! (7认同)
  • 这是更好的答案。在我的数据库中,我在具有预先存在的空值的列上添加了空约束。Change_column 不会更新这些值。根据文档,change_column_null 有一个可选的第四个值,它是更新的新值。 (2认同)

Dan*_*ich 91

尝试change_column:

__PRE__

  • 小心这种方法 - 如果你有关于该列的其他属性(例如`:limit`约束),你需要在使用`change_column`时重复这些属性,否则它们将丢失.出于这个原因,我更喜欢使用`change_column_null` (25认同)

rnd*_*ero 9

1)FIRST:添加具有默认值的列

2)然后:删除默认值

add_column :orders, :items, :integer, null: false, default: 0
change_column :orders, :items, :integer, default: nil
Run Code Online (Sandbox Code Playgroud)

  • 当您需要添加不为null的新列时,这是正确的解决方案,您首先需要定义它具有默认值,因为SQLLite会抱怨(无法添加默认值NULL的NOT NULL列),然后将其删除! (2认同)