2012-04-10 6 views
4

Ich versuche, eine Schienen Migration auszuführen, und ich sehe den Fehler "BLOB/TEXT-Spalte in der Schlüsselspezifikation ohne eine Schlüssellänge verwendet" ... Allerdings, ich geben Sie die Länge in der Migrationsklasse an. Rails scheint dies zu ignorieren, wenn die SQL-Anweisung aus der Migration generiert wird. Irgendwelche Hinweise?Rails BLOB/TEXT-Spalte in der Schlüsselspezifikation ohne eine Schlüssellänge verwendet

Hier ist meine Migration Klasse:

class AddIndexToAccounts < ActiveRecord::Migration 
def self.up 
    add_index :TACCOUNT, :NAMEX, :length => 5 
end 
def self.down 
    remove_index :TACCOUNT, :NAMEX 
end 
end 

Und hier ist der Fehler ausgegeben. Es scheint, die Längenangabe gesehen zu haben, aber es ist nicht in der SQL-Anweisung, dass es erzeugt:

** [out :: 192.168.10.7] -- add_index(:TACCOUNT, :NAMEX, {:length=>5}) 
** [out :: 192.168.10.7] rake aborted! 
** [out :: 192.168.10.7] An error has occurred, all later migrations canceled: 
** [out :: 192.168.10.7] 
** [out :: 192.168.10.7] Mysql::Error: BLOB/TEXT column 'NAMEX' used in key specification without a key length: CREATE INDEX `index_TACCOUNT_on_NAMEX` ON `TACCOUNT` (`NAMEX`) 
+0

Die Indizierung von 'TEXT'-Spalten ist normalerweise eine schlechte Idee. Warum ist diese Spalte dieses Typs an erster Stelle, wenn Sie sie indizieren müssen? – tadman

+0

Ich stimme dir zu, deshalb versuche ich nur die ersten paar Zeichen zu indizieren. Ich arbeite gerade mit der Datenbankstruktur, die ich gegeben wurde –

Antwort

9

Sie könnten versuchen, um genauer zu sehen sein, wenn, dass es Tricks in Arbeits:

add_index :TACCOUNT, :NAMEX, :length => { :NAMEX => 5 } 

Als letzten Ausweg können Sie den Index auf "harte Art" mit SQL direkt erstellen, indem Sie die falsche ADD INDEX-Anweisung anpassen und execute auf der richtigen Anweisung verwenden.

+0

Vielen Dank. Ich wusste nicht, dass Sie in einer Migration Raw SQL ausführen können ... Nun versuchen Sie herauszufinden, warum wir hier ein Longtext-Feld verwenden ... Danke nochmal! –

+0

Sie können in einer Migration tun, was Sie wollen. Die Hilfsmethoden wie 'add_index' sind nur für Ihre Bequemlichkeit da. Sie sollten bei solchen Vorgängen vorsichtig sein, da die Testdatenbank möglicherweise nicht über die richtigen Indizes verfügt, wenn der Schema-Dumper für Ihre Struktur keinen Sinn ergibt. Dies führt manchmal dazu, dass Tests sehr langsam ausgeführt werden, wenn Sie viele Daten ohne die erwarteten Indizes laden. – tadman