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

e.g. 
table XYZ
id
1
2
3
4

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

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

7
FinalForm 26 Авг 2011 в 18:52

3 ответа

Лучший ответ

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

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

Если таблица по-прежнему непрерывна, они останутся такими же.

11
Yuck 26 Авг 2011 в 14:56

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

4
Ciaran Keating 26 Авг 2011 в 14:55

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

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

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

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

3
user12861 26 Авг 2011 в 14:54