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 序列应该就位。
我希望在我的 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 序列应该就位。