こんにちは。
GMOアドマーケティングのR.Sです。
今回は、IDがオートインクリメントされないテーブルを作成する方法を紹介したいと思います。
IDを指定したいときや、IDカラムを使わずに他のカラムをプライマリーキーとして使いたいとき用の手順です。
動作環境
- Ruby 3.1.4
- Ruby on Rails 7.0.4
テーブルを作成する
基本は通常のテーブル作成手順と同様です。今回はItemテーブルを作成してみます。
まずは下記のコマンドを実行します。
$ bundle exec rails g model Item
作成されたマイグレーションファイルを修正します。
このとき注目すべきポイントは3つです。
- id: false として、オートインクリメントされるIDカラムが作られないようにする
- t.column というメソッドでIDカラムを追加する(任意のカラム名で良い)
- ‘INTEGER PRIMARY KEY NOT NULL’ としてプライマリーキーの定義をする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class CreateItems < ActiveRecord::Migration[7.0] def change create_table :items, id: false do |t| # id: falseを足す t.column :id, 'INTEGER PRIMARY KEY NOT NULL' # idカラムを作成、プライマリーキーに設定 t.string :name t.timestamps end end end |
修正したらマイグレーションを実行して完了です。めっちゃ簡単!
まとめ
業務でオートインクリメントを使わないという運用のテーブルがあり、Railsの場合はどうするのか調べたことをブログにしました。 1対1で紐づけるテーブルを作成するときに、普段は、id,a_id,b_idという3つのカラムでテーブルを作成していますが、単純に紐づけるだけなら今回の方法で、a_id,b_idだけでも作成できるのでは?と考えるきっかけになりました。とはいえ、既にあるテーブルのIDから変更するのは、外部キーとして参照されていると手順が厄介だし、そもそも本番で使用されていたらリスクもあると思うので、テーブル設計は用途を踏まえて行った方が良いと改めて思いました。(当たり前ですが)