LoginSignup
5
0

More than 5 years have passed since last update.

Rails5でMySQLのid以外にbigint + primary key + auto increment する。(migration)

Last updated at Posted at 2019-05-23

やり方

調べたところRails4の頃の情報しか見当たらず、漁ると

auto_increment オプションが搭載されたことにたどり着く。

cerate_tableでの:idに続けざまに書くことで対応可能となるらしい。

以下は、PKをcompany_idにした会社マスタのサンプルである。

/db/migrate/example.rb
def change
  create_table :m_company, primary_key: "company_id", id: :bigint, comment: "会社ID", auto_increment: true, default: nil, force: true, comment: '会社マスタ' do |t|
    ## t.bigint :company_id, null: false, comment: '会社ID' ※←ここには書かない
    t.string :name, null: false, comment: '会社名'
    t.text :detail, comment: '内容'
    t.datetime :created_at, null: false, comment: '作成日時'
    t.datetime :updated_at, null: false, comment: '更新日時'
  end
end

以下となる。

mysql> desc m_company;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| company_id | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255) | NO   |     | NULL    |                |
| detail     | text         | YES  |     | NULL    |                |
| created_at | datetime     | NO   |     | NULL    |                |
| updated_at | datetime     | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

あとから変えたい場合は、change_columnで入る

こんな感じ。rollbackできるようにupとdownで書く

/db/migrate/example.rb
def up
  change_column :m_company, :company_id, :primary_key, auto_increment: true
end
def down
  change_column :m_company, :company_id, :bigint
  execute "ALTER TABLE m_company DROP PRIMARY KEY;"
end

問題 コメントが入らない

create_tableでPKを作成してしまうと、テーブルのコメントはかけてもPKカラムのコメントが入らない。(comment:オプションが被るから)

ので、

/db/migrate/example2.rb
def up
  create_table :m_company, primary_key: "company_id", id: :bigint, auto_increment: true, default: nil, force: true, comment: '会社マスタ' do |t|
    t.string :name, null: false, comment: '会社名'
    t.text :detail, comment: '内容'
    t.datetime :created_at, null: false, comment: '作成日時'
    t.datetime :updated_at, null: false, comment: '更新日時'
  end
  change_column :m_company, :company_id, comment: "会社ID"
end

def down
  # change_column :m_company, :company_id, comment: nil ※コメントだけ追加ならばこれ
  drop_table :m_company
end

これでコメントも追加できる”が”、schema.rbを確認するとわかるように
change_columnの内容がcreate_tableにマージされてしまっているのがわかる。

ゆえに、db:setupをした場合は、PKのキーにコメントが入らないためdb:migrateをすることをお勧めする。

参考資料

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0