sql—从表中删除一个项(行),但保留未使用的id号以备将来插入

9q78igpj  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(453)

我有一个数据库和一个“库存”表,其中包含一个商店的产品。每种产品都使用表中“id”列中设置的id号进行标识。我希望能够从表中删除产品,但保留已删除产品的id号,以便将来将产品插入数据库。作为演示,我插入了4个项目,并将它们全部命名为“test”

作为一个例子,我将“删除的”产品命名为“vacio”(西班牙语中为空),以显示我删除的产品。

现在,如果将来要添加另一个产品,id号2是未使用的,我想添加具有该id号的产品,而不是4(遵循给定的示例)。
delete查询是不好的,因为它也会删除id号,所以它是不允许的。我考虑过检查表中包含值“vacio”的第一行,并在除id以外的所有字段中使用update查询,但这感觉不太“优雅”,效率也不高,因为它需要多次更新值。有什么好办法吗?

mf98qq94

mf98qq941#

实际上,我并不建议重用旧的标识符。首先,这会阻止您使用 auto_increment 特性,这意味着您需要为每次插入手动处理列:这增加了复杂性,而且效率不高。此外,如果有其他表引用产品id,则可能会导致数据库中的完整性问题。
但如果你真的想这么做:我会选择删除选项。如果有外键引用该列,请确保它们具有 on delete cascade 选项已启用,以便在删除产品时从相关表中正确清除数据。
然后,您可以使用以下查询在下次创建新产品时填补第一个可用的空白:

insert into products(id, categoria, producto)
select min(id) + 1, 'my new category', 'my new product'
from products p
where not exists (select 1 from products p1 where p1.id = p.id + 1)
oxalkeyp

oxalkeyp2#

您可以有一个新列estado来处理记录是活动的(1)还是非活动的(0)。然后,要只获得“未删除”的记录,只需按新列进行筛选。这样,您还可以防止将产品名称更改为“vacio”,这在将来可能有用。

相关问题