Определите, Имеет Ли Таблица Последовательные Значения Автоматического Приращения Первичного Идентификатора


Есть ли способ определить, имеет ли таблица, возможно, очень большая таблица, непрерывные/последовательные идентификаторы первичного ключа с автоматическим приращением? Есть ли способ определения этого с помощью SQL-запроса? Предположим, кто-то случайным образом удаляет несколько строк из очень большой таблицы. Мне нужно знать, что это произошло.

e.g. 
table XYZ
id
1
2
3
4

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

Интересуюсь целостностью данных. Мне нужна методология SQL-запросов, чтобы все было просто и не нужно было писать PHP-скрипт для работы с базой данных.

Author: FinalForm, 2011-08-26

3 answers

Вы могли бы сравнить эти два значения:

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

Если таблица все еще смежна, они будут одинаковыми.

 11
Author: Yuck, 2011-08-26 14:56:25

Как насчет этого: подсчитайте количество строк, вычтите наименьший идентификатор из наибольшего, и если два числа совпадают, то идентификаторы будут смежными.

 4
Author: Ciaran Keating, 2011-08-26 14:55:42

Используйте самостоятельное соединение

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

Если пробелов нет, то будет возвращена только одна строка для последнего элемента в таблице. Вы даже можете исключить эту строку из набора результатов, если хотите быть умным, но это должно дать вам представление.

Этот метод особенно полезен, если вы хотите больше работать с пробелами. Если нет, то методы подсчета, предложенные другими, проще.

 3
Author: user12861, 2011-08-26 14:54:55