mysql - 如何找到 MySQL 记录集中的 ID 间隙?

标签 mysql recordset gaps-and-islands

这里的问题与我的另一个问题有关...

我有数百万条记录,每条记录的 ID 都是自动递增的,不幸的是,有时生成的 ID 有时会被丢弃,因此 ID 之间存在许多差距。

我想找到差距,并重新使用被遗弃的 ID。

在 MySQL 中执行此操作的有效方法是什么?

最佳答案

首先,您想要通过重用跳过的值获得什么优势?一个普通的 INT UNSIGNED 可以让你数到 4,294,967,295。对于“数百万条记录”,您的数据库在用完有效 ID 之前必须增长一千倍以上。 (然后使用 BIGINT UNSIGNED 将使您达到 18,446,744,073,709,551,615 个值。)

尝试回收 MySQL 已跳过的值可能会耗尽您的大量时间来尝试补偿一开始真正不会打扰 MySQL 的事情。

话虽如此,您可以通过以下方式找到丢失的 ID:

SELECT id + 1
FROM the_table
WHERE NOT EXISTS (SELECT 1 FROM the_table t2 WHERE t2.id = the_table.id + 1);

这将只找到每个序列中第一个缺失的数字(例如,如果您有 {1, 2, 3, 8, 10},它将找到 {4,9}) 但它可能很高效,当然,一旦您填写了一个 ID,您就可以随时再次运行它。

关于mysql - 如何找到 MySQL 记录集中的 ID 间隙?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8449729/

相关文章:

php - 从表中选择唯一值

mysql - 什么时候应该关闭记录集?

sql - 行集不支持向后滚动

mysql - 我们如何找到 MySQL 中顺序编号的间隙?

MySQL 按列值分组 block ,按其他列排序

php - 使用表单和 mysql 进行动态项目数据管理

php - MySQL/PHP mysql_fetch_array() 始终丢失第一行

mysql - 在不登录的情况下检查MySQL服务器是否启用了ssl

c# - 我可以使用什么强类型数据结构来保存具有不同形状的多个 RecordSet 的集合

sql - Postgres : "cumulative" view of table