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

时间:2018-06-22 14:27:52

标签: java mysql derby

考虑此问题:

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

问题:

  • 在这个数据库中是否有一种很好的方法来重新分配唯一的ID,以便它将再次从1变为10?
  • 这会被视为不良做法吗?

我问这个问题,因为在使用了该数据库后:添加和删除值后ID会明显不同。

2 个答案:

答案 0 :(得分:1)

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

SET @rn = 0;

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

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

答案 1 :(得分:0)

如果将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. 将临时表中的值复制回现有表中。您可以再次使用INSERT INTO SELECT,但是请确保将temp表放在最后

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

从本质上讲,您想要做的只是一个简单的反模式,通常会将有经验的程序员所采用的通用模式和实践转变成易于出乎意料的问题和/或失败的解决方案...并且,当/当涉及高级功能,例如将这种反模式应用于利用galera群集和/或应用程序缓存的应用程序。