我想在我的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删除Book 3,执行如下操作:db.Delete(&Books{}, 3)
,如文档所述:https://gorm.io/docs/delete.html#Delete-with-primary-key,则Book 3被删除。
那么,如果我再做一个查找,我会得到这个:
[
{
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:"-"`
}
然后,当我进行查找时,我会过滤删除的=true的…但是这会占用我的数据库文件太多空间,所以我想要另一个解决方案。
这是因为数据库在book表的id上生成了一个新的序列生成器,每当您添加一本书时,它将从sequencer获取当前值,将其添加到行并将其增加为下一个值。
无法返回并填充从行中删除的id。这是不需要担心的。当它呈现给用户时,不要显示乱序的数字,只显示1、2、3,并且在执行更新、删除等操作时使用此id。
或者你可以用UUID代替整数
考虑你的gorm结构是:
type Books struct {
gorm.Model
Name string `json:"name"`
Author uint `json:"author"`
}
,弄脏。模型给出字段:ID, CreatedAt, UpdatedAt, DeletedAt
当您执行db.Delete(&Books, 3)
时,它将执行软删除,这意味着DeletedAt将从null
更新为timestamp
。这不会从DB中物理地删除记录。您仍然可以通过db.Unscoped().Find(&Books)
获取此记录。永久删除记录:db.Unscoped().Delete(&Books,3)
我猜(我还没有尝试过!)永久删除记录后,您的ID序列应该落在适当的位置。