作为一个简单的背景,我有一个表foo,它有一个可以为空的int外键bar_id。我有一个函数可以从foo中删除bar关联,也就是将它设置为NULL。
我已经尝试了所有方法:我尝试使用sql.NullInt64作为列类型,然后
foo.BarId.Valid = false // even set Int64 = 0 for good measure
db.Save(&foo) // with LogMode(true)在UPDATE语句中未更新bar_id
我试过了:
db.Raw("UPDATE foo SET bar_id = NULL WHERE id = ?", foo.ID).Row().Scan(&foo)谢天谢地,SQL是正确的,但是对象没有更新。我认为我的gorm版本也没有Error。
我尝试将Foo.BarId的类型更改为*int64,并将指针设置为nil,但输出查询没有将bar_id更改为NULL。
我该怎么办?
发布于 2019-02-15 05:19:41
这样啊,原来是这么回事。我需要明确地在Select()中包含该列
db.Model(&foo).Select("bar_id").Updates(map[string]interface{}{"bar_id": nil})发布于 2021-08-25 08:52:49
另一种方法:
//RemoveAllChildren remove all the children
func RemoveAllChildren(db *gorm.DB, dataEdit Mat) (Mat, error) {
var matupdate Mat
db.Where("id = ?", dataEdit.ID).First(&matupdate)
if err := db.Model(&matupdate).Update("children_mat", gorm.Expr("NULL")); err != nil {
return matupdate, errors.New("cannotUpdate")
}
return matupdate, nil
}请参阅:https://gist.github.com/thanhtungka91/186dca4cd14d30581bb98193153a55bf
发布于 2021-09-11 02:37:43
您也可以使用gorm.Expr("NULL"),如下所示:
db.Model(&foo).Select("bar_id").Updates(map[string]interface{}{"bar_id": gorm.Expr("NULL")})您也可以在datetime数据库字段类型上使用它。
https://stackoverflow.com/questions/54698391
复制相似问题