【问题标题】:Determine If Table Has Consecutive Primary ID Auto Increment Values确定表是否具有连续的主 ID 自动增量值
【发布时间】:2011-11-04 14:43:18
【问题描述】:

有没有办法确定一个表(可能是一个非常大的表)是否具有连续/连续的自动增量主键 ID?是否有 SQL 查询方法来确定这一点?假设有人从一个非常大的表中随机删除了一些行。我需要知道这已经发生了。

e.g. 
table XYZ
id
1
2
3
4

table abc
1
2
4 <--- non contiguous, skipped 3
5

对数据完整性感到好奇。我想要一种 SQL 查询方法,以使事情变得简单,而不必编写 PHP 脚本来针对数据库运行。

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    您可以比较这两个值:

    SELECT (MAX(ID) - MIN(ID)) + 1, -- e.g. ID 2 - ID 1 = 1 (+1) = 2 rows
           COUNT(ID)
    FROM Table
    

    如果表格仍然是连续的,它们将是相同的。

    【讨论】:

    • 我不确定是否有必要计算出 MIN(id) 和 MAX(id) 的差异。将MAX(ID)COUNT() 进行比较就足以判断是否存在。例如SELECT (MAX(id) - COUNT(*)) FROM table,其中 0 表示连续,> 1 表示缺失的记录数。
    • @Treffynnon:假设表 ID 列以 0 或正数开头。如果由于某种原因它开始为负 - 它可以 - 那么你实际上必须比较差异。
    【解决方案2】:

    如何:计算行数,从最高的 ID 中减去最低的 ID,如果两个数字匹配,则 ID 是连续的。

    【讨论】:

      【解决方案3】:

      使用自联接

      SELECT *
      FROM t t1
      LEFT JOIN t t2 ON t2.ID = t1.ID + 1
      WHERE t2.ID IS NULL
      

      如果没有间隙,这将只返回一行,用于表中的最后一个元素。如果您想聪明一点,您甚至可以从结果集中删除该行,但这应该会给您一个想法。

      如果您想对间隙进行更多工作,此技术特别有用。如果没有,其他人建议的计数技术会更简单。

      【讨论】:

      • 如果您需要真正知道每个岛的开始和结束,您应该能够通过单次扫描表来完成此操作,如果您使用用户变量则无需连接。类似于 best-n-per-group 方法。
      猜你喜欢
      • 2017-06-22
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 2020-09-01
      相关资源
      最近更新 更多