我有一个使用add_index
向现有表添加索引的迁移
add_index :foo, [:foo_type, :bar_id, :baz_id], :unique => true
但是,我的字段足够长,超过了InnoDB密钥的最大长度。根据Anders Arpteg's answer到How do I increase key length in MySQL 5.1?,我需要像这样生成SQL:
CREATE UNIQUE INDEX `index_matches_on_foo_and_bar_id_and_baz_id` ON `matches` (`foo`(100), `bar_id`(100), `baz_id`(100))
我能以一种很好的Rails-y的方式来做这件事吗?或者我必须在我的迁移中屈尊使用原始SQL?
发布于 2011-05-05 14:24:13
不幸的是,rails在add_index中不支持:limit选项(至少在2.x中不支持)。但是,您始终可以使用execute并直接输入sql。
发布于 2011-05-05 14:20:54
您可以为使用的每个字段指定手动长度,使其不超过总长度限制:
add_index(:foo, [:foo_type, :bar_id, :baz_id], :unique => true, :length => {:foo_type => 100, :bar_id => 20, :baz_id => 20})
发布于 2011-05-05 14:28:45
您可以指定长度参数,这将生成与您要求的SQL完全相同的SQL:
add_index :foo, [:foo_type, :bar_id, :baz_id], :unique => true, :length => 100
两个缺点:
中添加的,因此您必须使用MysqlAdapter才能使其工作(可能其他适配器也实现了它,我只知道Rails本身不支持它)。
https://stackoverflow.com/questions/5899111
复制