考虑此问题:
问题:
我问这个问题,因为在使用了该数据库后:添加和删除值后ID会明显不同。
答案 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以保留序列即可。解决方法可能是执行以下步骤:
delete from <table> where ID = _value
insert into <backup_table> select <coluum1, column2, ...> from <table>
truncate table <table>
请注意,我不建议您这样做,主要是因为大多数人在他们的应用程序中使用某种缓存,并且他们还使用特定的方式来评估特定对象是否相同。 即在Java中,用于POJO的equals()和hashCode()方法被覆盖,并且程序员通常依赖于ID作为标识特定对象的永久方法。通过使用上述方法,您实质上破坏了整个概念,并且我不建议您出于这个原因而更改对象的自动增量ID值。
从本质上讲,您想要做的只是一个简单的反模式,通常会将有经验的程序员所采用的通用模式和实践转变成易于出乎意料的问题和/或失败的解决方案...并且,当/当涉及高级功能,例如将这种反模式应用于利用galera群集和/或应用程序缓存的应用程序。