【问题标题】:How to redistribute unique integer ids in a MySQL database?如何在 MySQL 数据库中重新分配唯一的整数 ID?
【发布时间】:2018-06-22 14:27:52
【问题描述】:

考虑一下:

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

问题:

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

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

【问题讨论】:

  • 指定示例或代码
  • 这会被认为是不好的做法吗?是的,我认为这是一种不好的做法。
  • 你有什么理由尝试这样做吗?

标签: java mysql derby


【解决方案1】:

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

SET @rn = 0;

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

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

【讨论】:

  • 我认为他们的想法是错误的。数据库中的唯一标识符不应用作对象的计数器。我认为更好的方法是添加一个新变量,例如行并改用它。你同意吗?
  • @rocispire 实际上,我认为我的建议是一个很好的建议,因为您可能能够依赖顺序,但不能依赖连续值。
【解决方案2】:

如果您将 ID 列设置为主键和自动增量,“重置”并不是真正必要的,因为它会一直分配唯一的 ID。

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

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

  1. 首先删除条目。即delete from <table> where ID = _value
  2. INSERT INTO SELECT(没有 id 列)。请注意,该表的列和类型必须相同,才能使该查询正常工作,可以这么说……您也可以将临时表用作备份表。即insert into <backup_table> select <coluum1, column2, ...> from <table>
  3. 截断您的表,即truncate table <table>
  4. 将临时表中的值复制回现有表中。您可以再次使用 INSERT INTO SELECT,但请确保最后删除临时表

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

本质上,您想要做的只是一种反模式,并且通常会将经验丰富的程序员采用的常见模式和实践转化为容易出现意外问题和/或失败的解决方案......这尤其适用于 if/when涉及高级功能,例如将这种反模式应用到利用 galera 集群和/或应用程序缓存的应用程序中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 2019-11-20
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 2022-08-03
    • 2011-01-11
    相关资源
    最近更新 更多