約束の地

キャロの想い出

Ridgepole で主キーを変更する方法(「id」カラムを作らないようにする方法)

Ridgepole

Active Record ほぼ準拠のマイグレーションツールです。

「id」カラムの除去

Ridgepole でごく普通にマイグレーションをすると、「id」というインクリメンタルな主キーのカラムが生成されます。新たにデータベースを生成する際には問題ないとは思うのですが、既存のデータベースのマイグレーションをする場合には不要なことも少なくありません。

「id」カラムを除去するには、create_tableのオプションにid: falseを付与すればよいです。具体的には以下のとおりです。

create_table "テーブル名", force: :cascade, id: false,... do |t|...

新しい主キーの設定

「id」カラムを除去しただけですと主キーが見失われますので、主キーを設定してやります。主キーの設定をするためには3つの記述を行う必要があります。

1つ目の記述

create_tableにてprimary_key: [主キーにするカラム名を配列で書く]というオプションを付与します。具体的には以下のとおりです。複合主キーにも対応しています。

create_table "テーブル名", force: :cascade, id: false, primary_key: [:column_1, :column_2]... do |t|...

2つ目の記述

主キーにするカラム(群)にNOT NULL制約を付けます。具体的には以下のとおりです。

  (省略)
  t.integer "column_1", null: false
  t.integer "column_2", null: false
  (省略)

3つめの記述

主キーにするカラム(群)にUNIQUE制約を付与します。具体的には以下のとおりです。

add_index :テーブル名, [:column_1, :column_2], unique: true

主キーの設定が完了

上記のようにスキーマファイルを書いてマイグレーションを実行すれば、主キーを任意のカラムに設定できると思います。

Powered by はてなブログ