如何使用 MySQL 让我的数据库重新排序 ID 号? [复制]

Posted

技术标签:

【中文标题】如何使用 MySQL 让我的数据库重新排序 ID 号? [复制]【英文标题】:How to have my Database reorder id number in order using MySQL? [duplicate] 【发布时间】:2018-07-19 14:38:16 【问题描述】:

我有一个玩家 ID 不连续的玩家数据库:

1 玩家 1

2 玩家 2

16 玩家 16

27 玩家 27

28 玩家 28

我想保持玩家的顺序,但更改他们的 ID 以使他们成为连续的(即以 1 为增量上升)。

这可以使用 SQL 语句来实现吗?

想要的结果:

1 玩家 1

2 玩家 2

3 玩家 16

4 玩家 27

5 玩家 28

我有一个 28,000 行的数据库,大约有 25,000 行将被删除,我想将剩余的 3000 行依次向下移动。

提前感谢您的帮助,我希望我解释得足够清楚。

【问题讨论】:

【参考方案1】:

如果它只是一个简单的开关,你可以在你的数据库上运行这样的东西:

update players as p 
set p.id = (
    SELECT count(*) from (select id from players) as sub 
    where p.id > sub.id
)

如果您想从 1 开始,请使用 >=

【讨论】:

【参考方案2】:

假设您的空白在您表格的ID 字段中,您完全不必担心这些漏洞。 ID 列应该完全无意义,并且纯粹用于将其他列的值联系在一起。 ID 值之间存在间隙是很常见的,并且根本不会影响您的表格(除了美观)。

例如,您有第三列等于您的ID。我假设那是您关心的实际数据(例如玩家标签)。为该播放器运行 SELECT 时,您将根据 that 列运行查询。拥有player_id2 的玩家可以拥有id1 - 这完全没问题!

例如,如果你想返回这个播放器,你会运行:

SELECT * FROM players WHERE player_id = 2;

可能会返回:

ID  | Name   |  player_id
-------------------------
1   | player |  2

上面的1ID 无所谓,因为你已经拥有了所有你关心的数据。它只是一个索引。

您说您要删除 3000 左右的行,即使没有“订单”本身,这仍然完全没问题。只需使用WHERE 子句根据表中的其他列之一进行删除。这将挑选出要删除的目标行(留下更多空白)。

希望这会有所帮助!

【讨论】:

谢谢,我认为在其他桌子上,ID 字段可以留下漏洞。但是游戏中使用了玩家 ID 字段。你寻找一个 ID,如果那里没有任何东西,它会弹出“找不到用户”。在将游戏从测试版中打开之前,我们想清除已死的帐户并将自动增量向下移动(我知道该怎么做。)以清理数字。感谢您的快速回复! 即使player_id 中的空白也不重要,因为您只是针对特定 ID 运行搜索。就像搜索9999 可能找不到任何东西一样,可能搜索17 也找不到任何东西。除了美学之外,实际上没有必要做你所要求的事情:)如果你真的想这样做,它仍然是可能的,如另一个答案所示。 阅读弹出的问题,这对我来说是一样的,我想我可能必须手动完成。 T-T 必须根据玩家的去向转移 92 个数据库。至少我已经有了更新代码来完全移动某人。有点完美主义者,宁愿摆脱所有死号并压缩列表。感谢您的帮助,现在我知道当我需要重新排列一个不会影响到很多其他人的列表时该怎么做。

以上是关于如何使用 MySQL 让我的数据库重新排序 ID 号? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

mysql对自增id重新从1排序

mysql数据库自增id重新从1排序的两种方法

mysql数据库自增id重新从1排序的两种方法

mysql数据库自增id重新从1排序的两种方法

Mysql对自增主键ID进行重新排序

PHP+MySQL数据库ID重新排序源码