全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-21 6 分钟 ✍️ juanwangdev

GORM 更新记录

GORM 提供多种更新方法,用于修改单条记录的部分或全部字段。

定义

Save 更新全部字段(含零值),Update 更新单个字段,Updates 更新多个字段(忽略零值)。

语法

Go
func (db *DB) Save(value interface{}) (tx *DB)
func (db *DB) Update(column string, value interface{}) (tx *DB)
func (db *DB) Updates(values interface{}, conds ...interface{}) (tx *DB)

示例

Save 方法

Go
user.Name = "新名字"
user.Age = 30
db.Save(&user)
// UPDATE users SET name='新名字', age=30, updated_at=... WHERE id=1

Update 方法(单字段)

Go
// 更新单个字段
db.Model(&user).Update("name", "新名字")

// 使用 Column 表达式
db.Model(&user).Update("age", gorm.Expr("age + ?", 1)) // age = age + 1

Updates 方法(多字段)

Go
// 使用 map
db.Model(&user).Updates(map[string]interface{}{
    "name": "新名字",
    "age":  30,
})

// 使用结构体(仅更新非零值字段)
db.Model(&user).Updates(User{Name: "新名字", Age: 30})

更新选中的零值字段

Go
// 显式指定更新零值字段
db.Model(&user).Select("name", "age", "updated_at").Updates(user)

// 排除字段
db.Model(&user).Omit("updated_at").Updates(user)

条件更新

Go
db.Model(&User{}).Where("active = ?", true).Updates(map[string]interface{}{
    "status": "inactive",
})

Save、Update、Updates 区别

方法更新范围零值处理适用场景
Save全部字段更新零值完整覆盖更新
Update单个字段更新零值修改单个字段
Updates多个字段忽略零值字段批量修改非零值字段

注意事项

  • Save 会更新所有字段包括零值,UpdatedAt 自动更新
  • Updates 使用结构体时,零值字段(如 Age: 0)不会被更新,需用 map 或 Select
  • UpdateUpdates 需要配合 Model 指定主键条件,否则会更新全表
  • gorm.Expr 用于构建数据库表达式,实现字段自增等操作
  • 更新操作返回 RowsAffected 为 0 表示未匹配到记录

要点总结

  • Save 更新全部字段含零值,Update 改单字段,Updates 改多字段
  • Updates 结构体忽略零值,map 包含零值
  • 零值字段更新需用 Select 显式指定
  • 条件更新需配合 ModelWhere 避免全表更新
  • UpdatedAt 字段在每次更新时自动变更

📝 发现内容有误?点击此处直接编辑

← 上一篇 GORM 删除记录
下一篇 → GORM 查询条件构建
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库