为了账号安全,请及时绑定邮箱和手机立即绑定

删除戈尔姆,但继续增加ID

删除戈尔姆,但继续增加ID

Go
慕码人2483693 2022-09-19 17:38:28
我希望在我的gorm数据库上有唯一和自动增量ID,即使来自以前创建和删除的条目。我的数据库中有这个模型:type Books struct {    ID            uint `json:"-" gorm:"autoIncrement"`    Name          string `json:"name"`    Author        uint `json:"author"`}假设我创建了3本书,如果我运行,输出将是这样的:db.Find(&Books{})[  {    id: 1,    name: "name1",    author: 123,  },  {    id: 2,    name: "name2",    author: 123,  },  {    id: 3,    name: "name3",    author: 123,  },]如果我按 ID 删除第 3 册,则执行以下操作:,如文档所述:https://gorm.io/docs/delete.html#Delete-with-primary-key,则删除第 3 册。db.Delete(&Books{}, 3)所以,如果我再做一个发现,我会得到这个:[  {    id: 1,    name: "name1",    author: 123,  },  {    id: 2,    name: "name2",    author: 123,  },]当我再创建一本书时,问题就出来了,因为它将有3个作为ID。我希望新创建的书的ID为4,而不是3,所以我将有ID为1,2和4。“查找我希望”的输出是:[  {    id: 1,    name: "name1",    author: 123,  },  {    id: 2,    name: "name2",    author: 123,  },  {    id: 4,    name: "name4",    author: 123,  },]所以这基本上是我的问题。我还想过做这样的事情:type Books struct {    ID            uint `json:"-" gorm:"autoIncrement"`    Name          string `json:"name"`    Author        uint `json:"author"`    Deleted       bool `json:"-"`}然后,当我进行查找时,我会过滤已删除的=真实...但这会占用我的数据库文件太多空间,所以我需要另一种解决方案。
查看完整描述

2 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

这是因为数据库在book表中的id上生成一个新的序列生成器,每当您添加一本书时,它都会从序列器中获取当前值,将其添加到行中并为下一个值递增。

无法返回并填写从行中删除的 id。这是一件不用担心的事情。在向用户显示时,不要显示错误排列的数字,只显示1,2,3,并且为了执行更新,删除等操作,请使用此ID。

或者,您可以使用 UUID 而不是整数


查看完整回答
反对 回复 2022-09-19
?
墨色风雨

TA贡献1853条经验 获得超6个赞

考虑到你的策略结构是:


type Books struct {

    gorm.Model

    Name          string `json:"name"`

    Author        uint `json:"author"`

}

哪里有戈尔姆。模型为您提供字段:ID、创建时、更新时、已删除


当您执行时,它将执行软删除,这意味着 DeleteAt 将从 更新为 .这不会从 DB 中物理删除记录。您仍然可以通过以下方式获取此记录:db.Delete(&Books, 3)nulltimestampdb.Unscoped().Find(&Books)


要永久删除该记录:db.Unscoped().Delete(&Books,3)


我猜(我还没有尝试过这个!)在永久删除记录后,您的ID序列应该会到位。


查看完整回答
反对 回复 2022-09-19
  • 2 回答
  • 0 关注
  • 74 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信