2011-08-11 10 views
28

フィールドのデフォルト値を0から3に変更する必要がありますが、キャッチはすでに何千ものレコードを持っていて、レコードがデフォルト値0を持つ場合にのみ0から3に値を変更します1,2のような値は同じままでなければなりません。どうすればいい?フィールドのデフォルト値を変更し、既存のレコードのすべての値を新しい既定値に変更するには、古い既定値がある場合にのみ移行します。

+5

「SET SET value = 3 WHERE value = 0」を更新できませんか? – Pelshoff

答えて

74

する列を強制想定しているあなたの自己を交換する場合ではありませんテーブルの設定を変更するchange_column:

change_column :my_models, :attribute_name, :integer, :default => 3 
あなたがこの方法を使用することができます代わりにすべてのレコードをループしてそれらを個別に更新する、その後

そして、すべての既存のレコードを更新するには、次のようにupdate_all:

MyModel.update_all({ :attribute_name => 3 }, { :attribute_name => 0 }) 

を最初の引数は、設定するためにどのような価値の方法を伝え、2番目は伝えます更新する行の条件。

+0

素敵できちんとした、私はこれについて知りませんでした... –

+0

これは、すべてがデフォルト値を変更できるようになるかどうかわからないので、これが特定のデータベースでのみ機能するのではないかと思います。とにかく、私はそれがMySQLで動作することを確認することができます。 – mahemoff

+1

これを試したところ、構文が変更された可能性があります。これは私のために働いた: 'MyModel.update_all({:attribute_name => 3}、{:attribute_name => 0})' – AlexBrand

2
ALTER TABLE your_table MODIFY your_column tinyint(1) NOT NULL DEFAULT 3; 
UPDATE your_table SET your_column=3 WHERE your_column=0; 
  1. あなたの列がtinyint(1)であると仮定すると、同じ
  2. NOT NULLあなたはいつもあなたがメソッドを使用する必要があり、移行にNOT NULl
関連する問題