使用GORM将UUID设为主键时MySQL报错的问题
解决GORM在MySQL中使用UUID作为主键的问题
你的问题核心是数据库users表的id字段仍为默认的整数类型,但插入的是UUID字符串,导致类型不匹配、数据截断等错误。同时模型的GORM标签在MySQL环境下的写法不够准确,以下是具体解决步骤:
1. 修正User模型的GORM标签
调整ID字段的标签,明确指定MySQL兼容的字段类型(UUID带连字符是36位,用char(36)更高效),并简化重复的主键标签:
type User struct { ID string `gorm:"primaryKey;type:char(36)" json:"id"` Username string `json:"username" gorm:"unique"` Password string `json:"password"` }
若想让MySQL自动生成UUID(无需代码层钩子),可修改标签为:
ID string `gorm:"primaryKey;type:char(36);default:UUID()" json:"id"`
注意:MySQL 8.0及以上版本支持
UUID()函数,低版本可使用UUID_SHORT()(生成32位无连字符UUID,需对应将字段类型改为char(32))。
2. 同步数据库表结构
- 若表已存在:手动执行SQL修改字段类型(GORM的
AutoMigrate不会自动修改主键类型)
ALTER TABLE users MODIFY COLUMN id CHAR(36) NOT NULL PRIMARY KEY;
- 若为新表:直接通过GORM自动创建表结构
db.AutoMigrate(&User{})
3. 调整BeforeCreate钩子(可选)
如果保留代码层生成UUID的逻辑,uuid.NewString()生成的标准36位格式是符合要求的,只需确保数据库字段类型匹配即可。若改用数据库默认值生成UUID,可直接删除BeforeCreate钩子,减少冗余代码。
错误原因说明
- Error 1265/1264:
id字段为整数类型,UUID字符串长度远超整数存储范围,导致数据截断或超出范围 - Error 1366:整数字段无法存储字符串类型的UUID,触发类型不匹配错误
内容的提问来源于stack exchange,提问作者darkstar
相关产品推荐
相关产品推荐

