这里的问题与我的另一个问题有关...
我有数百万条记录,每条记录的 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/