为ObjectType(TEXT类型) 和ObjectId(整型) 创建联合索引在 GORM 中有两种常见的方式。考虑到你的ObjectType是text类型直接创建联合索引可能遇到问题这里给出标准的解决方案。 核心解决方案先调整字段类型MySQL 对TEXT类型字段直接创建索引有限制会报错Error 1170: BLOB/TEXT column used in key specification without a key length强烈建议先将ObjectType的字段类型改为VARCHAR并指定长度。gotype YourModel struct { // 修改为 VARCHAR 类型并指定长度 (如255) ObjectType string json:objectType gorm:column:object_type;type:varchar(255);index:idx_type_id,priority:1 // 联合索引的第二列 ObjectId int64 json:objectId,string gorm:column:object_id;index:idx_type_id,priority:2 }为什么这样做type:varchar(255)将字段类型明确指定为VARCHAR(255)避免 GORM 自动推断为TEXT这是为字段创建索引的前提。index:idx_type_id,priority:1和priority:2通过相同的索引名idx_type_id并设置优先级priority显式地规定了联合索引中字段的顺序。✅ 备选方案必须使用 TEXT 类型时如果业务上必须使用TEXT类型则需要在 GORM 标签中指定索引前缀长度。请注意这种方式只对 MySQL 有效。gotype YourModel struct { // 联合索引指定TEXT字段的前缀长度为191 ObjectType string json:objectType gorm:column:object_type;type:text;index:idx_type_id,class:FULLTEXT,type:hash,length:191,priority:1 ObjectId int64 json:objectId,string gorm:column:object_id;index:idx_type_id,priority:2 }需要知道的是这里通过length:191参数告诉 GORM 只对TEXT字段的前 191 个字符创建索引这是 MySQL InnoDB 引擎的一个常见限制。使用前缀索引意味着仅靠前 191 个字符无法完全保证记录的唯一性查询时也可能无法达到最精确的索引过滤效果。 总结你的代码可以这样修改综合来看更推荐第一种方案。你可以将代码修改为gotype YourStruct struct { // ... 其他字段 ObjectType string json:objectType gorm:column:object_type;type:varchar(255);index:idx_type_obj,priority:1 ObjectId int64 json:objectId,string gorm:column:object_id;index:idx_type_obj,priority:2 }⚠️ 重要提示修改完模型定义后需要通过db.AutoMigrate(YourStruct{})或在建表语句中手动添加来使索引生效。如果是更新已存在的表GORM 可能不会自动处理索引变更这时你可能需要手动执行DROP INDEX和CREATE INDEX的 SQL 语句。为了确保索引按预期工作建议在数据库终端使用SHOW INDEX FROM your_table_name;命令来验证索引是否正确创建。