禁止删除,但保持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删除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序列应该落在适当的位置。

相关内容

  • 没有找到相关文章

最新更新