Ruby on Rails:マイグレーションを使用して、null以外の制約を既存の列に追加するにはどうすればよいですか?


130

Rails(3.2)アプリでは、データベースに多数のテーブルがありますが、null以外の制約をいくつか追加するのを忘れていました。私はググってみましたが、既存の列にnullでない値を追加する移行を作成する方法を見つけることができません。

TIA。

回答:


93

Rails 4+の場合、(change_column_nullを使用した)ネイツの回答の方が優れています。

Rails 4より前の場合は、change_columnを試してください


25
このアプローチには注意してください。その列について他の属性(たとえば、:limit制約)がある場合、を使用するときにそれらの属性を繰り返す必要があります。そうしないと、属性change_columnが失われます。このため、私は使用することを好んでいますchange_column_null
Nathan Wallace

これは、IrreversibleMigrationあなたが望むものではないかもしれないことを生成することに注意してください。
Nic Nilov 2017

@NicNilovあなたは答えについて話しているのですか、それともNathan Wallaceのコメントですか?
マーク

@マーク私は答えについて話していました。
Nic Nilov

@NicNilov no dw私はダブルチェックしたかっただけなのにと思いました:)
Mark

274

change_column_nullを使用することもできます

change_column_null :table_name, :column_name, false

8
正解!
Josh Click

1
一連の列の場合は変更する必要があり、これには各列の列タイプを指定する必要がないため、はるかに優れています。
ドリアン

1
これがより良い答えです。私のデータベースでは、既存のnull値を持つ列にnull制約を追加していました。change_columnはこれらの値を更新しません。ドキュメントによれば、change_column_nullには、更新の新しい値であるオプションの4番目の値があります。
Merovex 2016年

これをありがとう。ベストアンサー。
Ryan Rebo 2017年

1
興味深い副作用....移行をロールバックすると、フィールドが反対になります(false-> true)。したがって、複数のフィールドの移行を作成してnull制約を追加し、一部のフィールドにnull制約があった場合、移行をロールバックすると、すでに移行されているフィールドからnull制約が削除されます。
jpw

10

1)最初:デフォルト値で列を追加します

2)次に、デフォルト値を削除します

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

2
これは、nullでない新しい列を追加する必要がある場合の正しい解決策です。SQLLiteが不平を言うため、デフォルト値があることを最初に定義する必要があります(デフォルト値がNULLのNOT NULL列を追加できません)。
ミラノ

2

新しいcreate migrationスクリプト/スキーマで使用している場合は、次のように定義できます。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.