参考文档
https://gorm.io/zh_CN/docs/update.html
// update只更新选择的字段
// updates 更新左右字段,两种形式:Map & 结构体,结构体零值不参与更新
// save无论如何都更新所有内容,包括零值
firstUser := TestUser{}
GLOBAL_DB.First(&firstUser)
updateUser := TestUser{}
updateUser.ID = firstUser.ID
updateUser.Name = "testUpdate"
updateUser.Age = 100
// Save 会保存所有的字段,即使字段是零值
// UPDATE `t_test_user` SET `name`='testUpdate',`email`='',`age`=100,`birthday`='0000-00-00 00:00:00',`member_number`=NULL,`activated_at`=NULL,`created_at`='0000-00-00 00:00:00',`updated_at`='2022-03-27 13:18:22.309',`deleted_at`=NULL WHERE `t_test_user`.`deleted_at` IS NULL AND `id` = 1
db.Save(&updateUser)
// Update 更新单个列
// UPDATE `t_test_user` SET `name`='hello',`updated_at`='2022-03-27 13:20:58.392' WHERE id = 2 AND `t_test_user`.`deleted_at` IS NULL
db.Model(&TestUser{}).Where("id = ?", 2).Update("name", "hello")
// 更新多列 Updates 方法支持 struct 和 map[string]interface{} 参数。当使用 struct 更新时,默认情况下,GORM 只会更新非零值的字段
// 根据 `struct` 更新属性,只会更新非零值的字段
// UPDATE `t_test_user` SET `name`='hello11',`age`=18,`updated_at`='2022-03-27 13:22:57.525' WHERE id = 3 AND `t_test_user`.`deleted_at` IS NULL
db.Model(&TestUser{}).Where("id = ?", 3).Updates(TestUser{Name: "hello11", Age: 18})
// 根据 `map` 更新属性
// UPDATE `t_test_user` SET `age`=18,`name`='hello55',`updated_at`='2022-03-27 13:24:02.192' WHERE id = 4 AND `t_test_user`.`deleted_at` IS NULL
db.Model(&TestUser{}).Where("id = ?", 4).Updates(map[string]interface{}{"name": "hello55", "age": 18})
// 更新选定字段 慎用
// UPDATE `t_test_user` SET `updated_at`='2022-03-27 13:30:51.572' WHERE `t_test_user`.`deleted_at` IS NULL AND `id` = 8
//db.Model(&TestUser{ID: 8}).Select("id").Updates(map[string]interface{}{"name": "test", "age": 44})
// 批量更新
// UPDATE `t_test_user` SET `age`=18,`updated_at`='2022-03-27 13:33:03.084' WHERE name = 'admin3' AND `t_test_user`.`deleted_at` IS NULL
db.Model(TestUser{}).Where("name = ?", "admin3").Updates(TestUser{Age: 18})
// UPDATE `t_test_user` SET `age`=18,`name`='hello' WHERE id IN (10,11)
updateResult := db.Table("t_test_user").Where("id IN ?", []int{40, 31}).Updates(map[string]interface{}{"name": "hello", "age": 18})
fmt.Println(updateResult.RowsAffected) // 更新的记录数
fmt.Println(updateResult.Error) // 更新的错误
// 高级更新 https://gorm.io/zh_CN/docs/update.html#%E4%BD%BF%E7%94%A8-SQL-%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%9B%B4%E6%96%B0
// UPDATE `t_test_user` SET `age`=age + 2,`updated_at`='2022-03-27 13:36:47.745' WHERE id = '2' AND `t_test_user`.`deleted_at` IS NULL
db.Model(TestUser{}).Where("id = ?", "2").Update("age", gorm.Expr("age + ?", 2))
// UPDATE `t_test_user` SET `age`=age - 1 WHERE id = '2' AND `t_test_user`.`deleted_at` IS NULL
db.Model(TestUser{}).Where("id = ?", "2").UpdateColumn("age", gorm.Expr("age - ?", 1))
// 返回被修改的数据,仅适用于支持 Returning 的数据库
// 返回所有列
var testUserList []TestUser
// UPDATE `t_test_user` SET `age`=age + 50,`updated_at`='2022-03-27 13:40:56.065' WHERE name = 'admin' AND `t_test_user`.`deleted_at` IS NULL
db.Model(&testUserList).Clauses(clause.Returning{}).Where("name = ?", "admin").Update("age", gorm.Expr("age + ?", 50))
// [] 不支持MySQL?
fmt.Println(testUserList)