web-dev-qa-db-ja.com

Railsのテーブルに主キーをさかのぼって追加するにはどうすればよいですか?

主キーなしでテーブルを作成しましたが(:id => false)、今ではお尻を噛むように戻ってきました。

私のアプリはすでに本番環境にあり、ドロップして別のアプリを再作成することはできません。

移行を実行して、別の自動インクリメントの主キー列をテーブルに追加する方法はありますか?

32
Jonathan Chiu

移行で主キーを追加するコマンドは次のとおりです。

add_column :my_table, :id, :primary_key

ただし、質問の文言は、テーブルにすでに自動インクリメント列があることを示しています。私が間違えない限り、テーブルに複数の自動インクリメント列を許可しないDBMSがいくつかあります。

すでに自動インクリメント列があり、実際にその列を主キーとして使用する場合は、モデルに次を追加するだけです。

set_primary_key "my_existing_column"

または、Railsの最新バージョンでは:

self.primary_key = "my_existing_column"

すでに自動インクリメント列があり、それを主キーとして使用できない場合は、運が悪い可能性があります。

47
Ryan

何らかの理由でカスタムidフィールドを使用してテーブルを作成したが、idを主キーとして設定するのを忘れた場合は、移行を実行して主キー制約を作成する必要があります。以下は、PostgreSQLデータベースに対してテストされました。

class AddPrimaryKeyConstraintToFoobars < ActiveRecord::Migration
  def up
    execute "ALTER TABLE foobars ADD PRIMARY KEY (id);"
  end

  def down
    execute "ALTER TABLE foobars DROP CONSTRAINT foobars_pkey;"
  end
end
5
Andrew

MySQlで、デフォルトの増分値を持つ列を追加できることを知っています。これを追加すると、各行に一意のint値が割り当てられます(新しい行には、最後に追加された行より1大きいint値が取得されます)。

この列を追加して、主キーとして設定できます。

1
Steven Feldman

これは、主キーを持つ実際のモデルになる必要がある結合テーブルでしたか?その場合、最善の策は、新しいテーブルを作成してデータをそのテーブルにコピーすることです。

0
dunedain289