如何在 MySQL 数据库中重新分发唯一的整数 ID?



考虑一下:

  • 我有一个包含 10 行的数据库。
  • 每一行都有一个唯一的id(int(与一些值配对,例如名称(varchar(。
  • 这些 ID 从 1 递增到 10。
  • 我删除了其中 2 条记录 - 2 和 8。
  • 我又添加了 2 条记录 11 和 12。

问题:

  • 有没有一种好方法可以重新分配此数据库中的唯一 id,以便它再次从 1 变为 10 ?
  • 这会被认为是不好的做法吗?

我问这个问题,因为在使用此数据库一段时间后:添加和删除值,ids 会有很大不同。

解决此问题的一种方法是在实际查询时仅生成所需的行号,如下所示:

SET @rn = 0;
SELECT 
(@rn:=@rn + 1) AS rn, name
FROM yourTable;
ORDER BY id;

一般来说,您不必担心MySQL分配的自动增量值。 MySQL将确保这些值是唯一的,而无需您的干预。

如果将 ID列设置为主键和自动增量,则实际上不需要"重置",因为它无论如何都会继续分配唯一的 ID。

如果困扰您的是现有值之间的"间隙",那么您可以通过使用带有位/布尔值的is_deleted列来诉诸"排序删除"。当然,默认值为 0(或 b0(。事实上,如果有一些非常重要的数据以后可能会有用,建议软删除,特别是如果它涉及与付款相关的条目的可能性,用户可以通过遗漏或故意删除其中一个条目。

没有简单的方法来使用删除,您只需删除一个值并重新排列剩余的 ID 以保留序列。解决方法可能是执行以下步骤:

  1. 首先删除条目,即delete from <table> where ID = _value
  2. 插入到选择(不带 ID 列(中。 请注意,表在列和类型方面需要相同,才能使此查询正常工作,可以这么说......您也可以使用临时作为backup_table。即insert into <backup_table> select <coluum1, column2, ...> from <table>
  3. 拖拽你的桌子,即truncate table <table>
  4. 将临时表中的值复制回现有表中。您可以再次使用插入选择,但请确保最后删除临时表

请注意,我不建议您这样做,主要是因为大多数人在他们的应用程序中使用某种缓存,并且他们还利用特定方法来评估特定对象是否相同。 即在Java中,POJO的equals((和hashCode((方法被覆盖,程序员通常依靠ID作为识别特定对象的永久方式。通过使用上述方法,您基本上打破了整个概念,我不建议您出于这个原因更改对象的自动增量 ID 值。

从本质上讲,您要做的只是一个反模式,并且通常会将经验丰富的程序员采用的常见模式和实践变成容易出现意外问题和/或故障的解决方案......这尤其适用于涉及高级功能的情况,例如在利用 Gera集群和/或应用程序缓存的应用程序中使用此反模式。

最新更新