【问题标题】:Re-Indexing MySQL INT Primary Keys & Reset AUTO_INCREMENT重新索引 MySQL INT 主键并重置 AUTO_INCREMENT
【发布时间】:2011-10-01 13:05:58
【问题描述】:

所以我有一个 MySQL 数据库,用于 PHP 站点。在数周的开发过程中,我留下了类似的东西:

Table: users

id  | name
-----------
  12| Bob
  34| Jen
 155| John
 154| Kyle

除了数百条记录,ID 数以千计。

我正在寻找一个我可以运行的脚本来将键重命名为它们的最小值(保留它们各自的行),然后将 AUTO_INCREMENT 重置为下一个 id

期望的输出是:

Table: users

id  | name
-----------
   1| Bob
   2| Jen
   3| Kyle
   4| John

还有ALTER TABLE users AUTO_INCREMENT = 5;

(通知KyleJohn

我意识到我必须修复任何引用 users.id 的内容。

有谁知道在 MySQL 或 PHP 脚本中执行此操作的方法?

【问题讨论】:

  • 我之前通过删除删除 ID 列并再次创建它来做到这一点,但是我不确定这将如何影响排序。编辑:我建议你在尝试这样的事情之前执行备份。

标签: php mysql database auto-increment


【解决方案1】:

删除 id 上的索引

做这样的事情:

SET @rank:=0;
update users
set id=@rank:=@rank+1
order by id;

在 id 上添加索引

【讨论】:

  • 这有效,但没有修复默认顺序。它仍然列为1,2,4,3i.imgur.com/YB6oE.png(停止删除你的cmets,让我看起来很傻=[)
  • @imoda 如果您执行像select * from t 这样的简单查询,您不必期待任何订单。表行的顺序未定义。有时,多次运行同一个查询会得到不同的结果。
【解决方案2】:

为什么需要更改数据库中名称的顺序?您可以在 sql 查询中添加 ORDER BY name 子句,以按名称的字母顺序获取结果。

【讨论】:

  • 我不想按名称的字母顺序对它们进行排序。我希望他们默认按id 排序,这样我就不必在站点范围内为我的查询标记ORDER BY 参数。
  • 试试alter table yourtable order by id,不过如果你使用的是InnoDB,这很可能没有效果。
  • 我曾一度认为 REPLACE...SELECT 可能会起作用,但文档说您不能引用与 REPLACE(实际上在插入文档中)目标和SELECT 目标。我认为您最好的选择可能是使用 PHP 脚本来创建用户表的临时副本,然后使用 REPLACE...SELECT 和 ORDER BY,最后删除临时表。当然,这就是假设@Marc B 推荐的语句不起作用。
  • 另一个想法是创建一个函数,该函数将使用 ORDER BY 按字母顺序返回用户的结果,然后您只需编写一次 ORDER BY 子句,而且它可能会干掉您的代码 ^ .^
猜你喜欢
  • 2018-05-02
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 2012-05-01
  • 2013-03-16
  • 2021-10-02
  • 2011-08-31
相关资源
最近更新 更多