Gorm删除但保持ID增加

Gorm delete but keep ID increasing

我希望在我的 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 本书,执行此操作:db.Delete(&Books{}, 3),如文档所述:https://gorm.io/docs/delete.html#Delete-with-primary-key,第 3 本书被删除。

所以,如果我再做一次 Find,我会得到这个:

[
  {
    id: 1,
    name: "name1",
    author: 123,
  },
  {
    id: 2,
    name: "name2",
    author: 123,
  },
]

当我再创建一本书时,问题就出现了,因为它的 ID 是 3。

我希望新创建的图书的 ID 为 4,而不是 3,因此我的 ID 为 1、2 和 4。

我想要的 Find 输出是:

[
  {
    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:"-"`
}

然后,当我进行查找时,我会过滤 deleted=true 的...但这会在我的数据库文件上占用太多 space,所以我想要另一个解决方案。

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

无法返回并填充从行中删除的 ID。这是不用担心的事情。将其呈现给用户时,不要显示排序错误的数字,只显示 1、2、3,执行更新、删除等操作时,请使用此 ID。

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

考虑到您的 gorm 结构 是:

type Books struct {
    gorm.Model
    Name          string `json:"name"`
    Author        uint `json:"author"`
}

其中 gorm.Model 为您提供字段:ID、CreatedAt、UpdatedAt、DeletedAt

当您执行 db.Delete(&Books, 3) 时,它会执行软删除,这意味着 DeletedAt 将从 null 更新为 timestamp.这不会从数据库中物理删除记录。您仍然可以通过 db.Unscoped().Find(&Books)

获取此记录

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

我想(我还没试过!)永久删除记录后,您的 ID 序列应该就位。