How do I handle too long index names in a Ruby on Rails ActiveRecord migration?
我试图添加一个从四个相关表的外键创建的唯一索引:
1 2 3 | add_index :studies, ["user_id","university_id","subject_name_id","subject_type_id"], :unique => true |
数据库对索引名称的限制会导致迁移失败。 这是错误消息:
Index name 'index_studies_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id' on table 'studies' is too long; the limit is 64 characters
我怎么处理这个? 我可以指定不同的索引名称吗?
为
1 2 3 4 | add_index :studies, ["user_id","university_id","subject_name_id","subject_type_id"], :unique => true, :name => 'my_index' |
如果在
1 | t.references :long_name, index: { name: :my_index } |
您还可以在
1 2 3 | create_table :studies do |t| t.references :user, index: {:name =>"index_my_shorter_name"} end |
在PostgreSQL中,默认限制为63个字符。因为索引名称必须是唯一的,所以有一点约定是很好的。我使用(我调整了示例来解释更复杂的结构):
1 2 3 | def change add_index :studies, [:professor_id, :user_id], name: :idx_study_professor_user end |
正常指数应该是:
1 | :index_studies_on_professor_id_and_user_id |
逻辑是:
-
index 变为idx - 单数表名称
- 没有加入的话
-
不
_id - 按字母顺序
通常这项工作。
你也可以
1 | t.index([:branch_id, :party_id], unique: true, name: 'by_branch_party') |
就像在Ruby on Rails API中一样。
与上一个答案类似:只需在常规add_index行中使用'name'键:
1 2 3 | def change add_index :studies, :user_id, name: 'my_index' end |