如何在使用MySQL的Ruby on Rails迁移中处理太长的索引名称?
我试图添加一个独特的索引,从四个关联表( 用户 , 大学 , subject_names , subject_types )的外键创build:
add_index :studies, ["user_id", "university_id", \ "subject_name_id", "subject_type_id"], :unique => true
MySQL对索引名称的限制导致迁移停止。 这是错误消息:
表'学习'上的索引名'index_studies_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id'太长; 限制是64个字符
我该如何处理? 我可以使用别名吗?
使用:
add_index :studies, ["user_id", "university_id", \ "subject_name_id", "subject_type_id"], :unique => true, :name => 'my_index'
更多的信息在add_index中 。
您也可以在create_table
块内的列定义中更改索引名称(例如从迁移生成器中获取)。
create_table :studies do |t| t.references :user, index: {:name => "index_my_shorter_name"} end
在PostgreSQL中, 默认的限制是63个字符 。 因为索引名称必须是唯一的,所以有一点约定是很好的。 我使用(我调整了示例来解释更复杂的构造):
def change add_index :studies, [:professor_id, :user_id], name: :idx_study_professor_user end
正常的指标是:
:index_studies_on_professor_id_and_user_id
逻辑是:
-
index
变成了idx
- 奇异的表名
- 没有join的话
- 没有
_id
- 按字母顺序
通常做这个工作。
你也可以做
t.index([:branch_id, :party_id], unique: true, name: 'by_branch_party')
就像Ruby on Rails API一样 。
与以前的答案类似:只需使用常规add_index行中的“name”键即可:
def change add_index :studies, :user_id, name: 'my_index' end