2017-01-25 6 views
1

私はrailsとmysql2アダプタを使用しています。私はすべてのプライマリIDと外部キーを、現在の本番データベースのように、デフォルトの32ビットではなく64ビットの整数に変更したいと考えています。レールはプライマリIDを64ビットに変更します。

これは即座に可能ですか、データベースを削除し、構造を変更してデータを再度インポートする必要がありますか?

データベースを削除せずに実行する方法がある場合、ハックであってもそれを知ることは素晴らしいことです。あなたは、単にまたRailsのと5.1の主キーを開始

def change 
    create_table :users, id: false do |t| 
    t.int :id, limit: 8, primary_key: true 
    t.string :first_name 
    t.string :last_name 
    end 
end 

を行うことができる必要があり、新たなテーブルの場合execute

class UpdateUserIdLimit < ActiveRecord::Migration 
    def up 
    # PostgreSQL 
    execute('ALTER TABLE users ALTER COLUMN id SET DATA TYPE BIGINT') 
    # MySQL 
    execute('ALTER TABLE users MODIFY COLUMN id BIGINT(8) NOT NULL AUTO_INCREMENT') 
    end 

    def down 
    raise ActiveRecord::IrreversibleMigration 
    end 
end 

を使用して

+0

任意の変更は、変換時にダウンタイムが発生します。 64ビット整数を必要とする表(おそらく数億ものレコードがある)の場合、その変換には非常に長い時間がかかります。これが稼働時間にどの程度影響するかを確認するためには、テストを実行する必要があります。 – tadman

+0

@tadmanありがとうございました。変換処理中にフォールバックデータベースを用意し、すべての新しいデータを元のデータベースに戻す前に同期化します。 – Ybrin

答えて

2

ActiveRecordのは、この機能をサポートしていませんが、あなたがそれを行うことができます既定ではBIGINTになります。

+0

私はそれを好きなら、 'id'には自動増分オプションがありますか? – Ybrin

+0

更新された回答を確認してください。 –

+0

'change_column'でこれを行う方法はありませんか? – tadman

4

のRails 5.1は、すでにあなたがこれを行うことができ、移行のためのbigintタイプを追加しました:

change_column :users, :id, :bigint 

出典:規模のデータベース上の http://www.mccartie.com/2016/12/05/rails-5.1.html

+0

実際の問題は、関連するすべての外部キーを 'bigint'(同様に制約自体)に変更する方法です。 –

関連する問題