我有一个迁移,它使用add_index
为现有表添加索引:
add_index :foo, [:foo_type, :bar_id, :baz_id], :unique => true
但是,我的字段足够长,超过了最大的InnoDB密钥长度。根据{{3}}到Anders Arpteg's answer,我需要像这样生成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?
答案 0 :(得分:8)
您可以为您使用的每个字段指定手动长度,以保持在总限制之下:
add_index(:foo, [:foo_type, :bar_id, :baz_id], :unique => true, :length => {:foo_type => 100, :bar_id => 20, :baz_id => 20})
答案 1 :(得分:6)
您可以指定长度参数,这将生成您要求的确切SQL:
add_index :foo, [:foo_type, :bar_id, :baz_id], :unique => true, :length => 100
两个缺点:
答案 2 :(得分:1)
检查此链接: https://github.com/rails/rails/issues/9855#issuecomment-28874587
可能确实很有帮助,在我身边很有效
答案 3 :(得分:-1)
不幸的是,rails不支持add_index中的:limit选项(至少不支持2.x)。但是,您始终可以使用execute而直接输入sql。