Определите, Имеет Ли Таблица Последовательные Значения Автоматического Приращения Первичного Идентификатора
Есть ли способ определить, имеет ли таблица, возможно, очень большая таблица, непрерывные/последовательные идентификаторы первичного ключа с автоматическим приращением? Есть ли способ определения этого с помощью SQL-запроса? Предположим, кто-то случайным образом удаляет несколько строк из очень большой таблицы. Мне нужно знать, что это произошло.
e.g.
table XYZ
id
1
2
3
4
table abc
1
2
4 <--- non contiguous, skipped 3
5
Интересуюсь целостностью данных. Мне нужна методология SQL-запросов, чтобы все было просто и не нужно было писать PHP-скрипт для работы с базой данных.
3 answers
Вы могли бы сравнить эти два значения:
SELECT (MAX(ID) - MIN(ID)) + 1, -- e.g. ID 2 - ID 1 = 1 (+1) = 2 rows
COUNT(ID)
FROM Table
Если таблица все еще смежна, они будут одинаковыми.
Как насчет этого: подсчитайте количество строк, вычтите наименьший идентификатор из наибольшего, и если два числа совпадают, то идентификаторы будут смежными.
Используйте самостоятельное соединение
SELECT *
FROM t t1
LEFT JOIN t t2 ON t2.ID = t1.ID + 1
WHERE t2.ID IS NULL
Если пробелов нет, то будет возвращена только одна строка для последнего элемента в таблице. Вы даже можете исключить эту строку из набора результатов, если хотите быть умным, но это должно дать вам представление.
Этот метод особенно полезен, если вы хотите больше работать с пробелами. Если нет, то методы подсчета, предложенные другими, проще.