2017-01-25 1 views
1

Ich benutze Schienen und den mysql2 Adapter. Ich möchte alle primären IDs und Fremdschlüssel zu 64-Bit-Ganzzahlen statt der Standard 32 Bit ändern, wie sie jetzt für meine Produktionsdatenbank sind.Schienen ändern primäre ID zu 64 Bit bigint

Ist dies möglich, on the fly oder muss ich die Datenbank löschen, um die Struktur zu ändern und die Daten wieder importieren?

Wenn es ein Weg, es zu tun, ohne die Datenbank zu fallen, auch wenn es ein Hack ist, wäre es gut zu wissen, sein.

+0

Jede Änderung an einer Datenbank in großem Umfang in der Ausfallzeit bei der Konvertierung führen. Für Tabellen, die 64-Bit-Ganzzahlen benötigen, die vermutlich Hunderte von Millionen von Datensätzen enthalten, kann diese Konvertierung sehr, sehr lange dauern. Sie müssen Tests durchführen, um zu sehen, wie stark sich dies auf Ihre Betriebszeit auswirkt. – tadman

+0

@tadman Vielen Dank, wir werden während des Konvertierungsprozesses eine Fallback-Datenbank haben und alle neuen Daten synchronisieren, bevor wir zurück zur Hauptdatenbank wechseln. – Ybrin

Antwort

2

Während Active dies nicht unterstützt, Sie in der Lage sind, es zu tun mit 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 

Für neue Tabellen sollten Sie in der Lage sein, einfach zu tun

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 

auch mit Rails 5.1 Primärschlüsseln starten wird standardmäßig BIGINT sein.

+0

Wird 'id' immer noch die Auto-Inkrement-Option haben, wenn ich das so mache? – Ybrin

+0

Bitte überprüfen Sie meine aktualisierte Antwort. –

+0

Kann ich das nicht mit 'change_column' machen? – tadman

4

Rails 5.1 bereits einen bigint Typen für Migrationen hinzugefügt, Sie können dies tun:

change_column :users, :id, :bigint 

Quelle: http://www.mccartie.com/2016/12/05/rails-5.1.html

+0

Das eigentliche Problem ist, wie man alle zugehörigen Fremdschlüssel auch zu 'bigint' (den Constraints selbst) ändert. –