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

Java 如何在MySQL数据库中重新分配唯一的整数ID?,java,mysql,derby,Java,Mysql,Derby,考虑这一点: 我有一个10行的数据库。 每一行都有一个唯一的id int和一些值,例如name varchar。 这些ID从1增加到10。 我删除了2条记录——2条和8条。 我再添加两条记录11和12。 问题: 有没有一种好方法可以在这个数据库中重新分配唯一的ID,使其再次从1变为10? 这会被认为是坏习惯吗? 我问这个问题,因为在使用了这个数据库之后:添加和删除值时,ID会有很大的不同。一种方法是在实际查询时生成所需的行号,如下所示: SET @rn = 0; SELECT (@r

考虑这一点:

我有一个10行的数据库。 每一行都有一个唯一的id int和一些值,例如name varchar。 这些ID从1增加到10。 我删除了2条记录——2条和8条。 我再添加两条记录11和12。 问题:

有没有一种好方法可以在这个数据库中重新分配唯一的ID,使其再次从1变为10? 这会被认为是坏习惯吗?
我问这个问题,因为在使用了这个数据库之后:添加和删除值时,ID会有很大的不同。

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

SET @rn = 0;

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

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

如果您将ID列设置为主键,并将其设置为自动递增,则实际上不需要重置,因为它将始终分配唯一的ID

如果困扰您的是现有值之间的差异,那么您可以通过使用带有位/布尔值的is_deleted列来进行排序删除。默认值当然是0或b0。事实上,如果有一些非常重要的数据以后可能会有用,特别是如果它涉及到与支付相关的条目,用户可以通过省略或故意删除其中一个条目,则建议软删除

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

先删除条目。i、 e.从其中删除ID=\u值 插入到“无id选择”列中。请注意,为了使该查询正常工作,表的列和类型必须相同,也就是说。。。您还可以使用临时表作为备份表。i、 e.插入“从中选择” 截断您的表,即截断表 将临时表中的值复制回现有表中。您可以再次使用INSERT INTO SELECT,但请确保最后删除temp表 请注意,我不建议您这样做,主要是因为大多数人在他们的应用程序中使用某种缓存,并且他们也使用特定的方法来评估特定对象是否相同。 也就是说,在Java中,POJO的equals和hashCode方法被重写,程序员通常依赖ID作为识别特定对象的永久方法。通过使用上述方法,您基本上打破了整个概念,因此我不建议您在进行任何其他操作之前,先更改对象的自动增量ID值


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

指定examle或Code这会被视为不好的做法吗?是的,我认为这是一个糟糕的做法。你有什么理由尝试这样做吗?我想他们的想法是错误的。数据库中的唯一标识符不应用作对象的计数器。我认为更好的方法是添加一个新变量,例如row,然后使用它。你同意吗?@rocispire事实上,我认为我的建议很好,因为你可能可以依赖顺序,但不能依赖连续值。