You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:48:10