猿问

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

我希望在我的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:"-"`

}

然后,当我进行查找时,我会过滤已删除的=真实...但这会占用我的数据库文件太多空间,所以我需要另一种解决方案。


慕码人2483693
浏览 84回答 2
2回答

元芳怎么了

这是因为数据库在book表中的id上生成一个新的序列生成器,每当您添加一本书时,它都会从序列器中获取当前值,将其添加到行中并为下一个值递增。无法返回并填写从行中删除的 id。这是一件不用担心的事情。在向用户显示时,不要显示错误排列的数字,只显示1,2,3,并且为了执行更新,删除等操作,请使用此ID。或者,您可以使用 UUID 而不是整数

墨色风雨

考虑到你的策略结构是: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序列应该会到位。
随时随地看视频慕课网APP

相关分类

Go
我要回答