
使用 gorm 的 `save()` 或 `create()` 方法插入数据后,gorm 会自动将数据库生成的主键(如 mysql 的 `auto_increment` 值)回填到结构体字段中,无需额外查询即可直接访问。
在基于 github.com/jinzhu/gorm(注意:此为旧版 GORM v1;新版为 gorm.io/gorm,但原理一致)的 MySQL 应用中,当你执行一次插入操作时,常需立即获取新记录的主键 ID(等价于 MySQL 的 LAST_INSERT_ID() 函数)。GORM 已对此做了良好封装:只要结构体中定义了符合约定的主键字段(如 Id、ID 或带 gorm:"primaryKey" 标签的字段),调用 Create() 或 Save() 后,该字段会被自动赋值。
✅ 正确用法示例(GORM v1):
type User struct {
Id int `gorm:"primary_key"`
Name string
}
user := User{Name: "jinzhu"}
result := db.Create(&user)
if result.Error != nil {
log.Fatal(result.Error)
}
fmt.Println("新插入用户的 ID:", user.Id) // ✅ 此时 user.Id 已被自动填充⚠️ 注意事项:
- 主键字段必须可导出(首字母大写),且类型需与数据库列兼容(如 int, int64, uint, uint64);
- 若使用 Save(),GORM 会根据主键是否为零值判断执行 INSERT 或 UPDATE;确保新建实例主键为零值(如 int 类型默认为 0);
- 使用 Create() 更语义明确,专用于插入新记录,且会跳过零值主键校验;
- 若主键非自增(如 UUID),需手动赋值或使用钩子(BeforeCreate)生成;
- GORM v2(gorm.io/gorm)行为完全一致,仅导入路径和初始化方式不同,Create() 后同样自动回填主键。
? 总结:无需手动执行 SELECT LAST_INSERT_ID() 或额外 SELECT 查询——GORM 在底层已通过 sql.Result.LastInsertId() 安全获取并注入。这是 ORM 提升开发效率的关键特性之一,合理利用可显著简化代码逻辑并避免竞态风险。










