Столбец auto_increment все еще не является непрерывным после перестроения в таблице MySQL - PullRequest
0 голосов
/ 09 ноября 2018

В базе данных Mysql (версия 8.0) есть таблица с именем "web_file" и столбцом auto_increment "num_id". Из-за некоторых операций удаления "num_id" не является непрерывным. Поэтому я удаляю исходный «num_id» и добавляю новый столбец auto_increment, который по-прежнему называется «num_id», начиная с 1. Но я считаю, что максимальное значение нового «num_id» не равно количеству строк. Вот мой sql код:

alter table web_file drop column num_id;
alter table web_file add column num_id int not null auto_increment unique key;
select min(num_id), max(num_id), count(num_id) from web_file;

Это результат:

1   664291  662902

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

1 Ответ

0 голосов
/ 09 ноября 2018

То, что вы видите, на самом деле не исключение, а то, как ведут себя столбцы автоинкремента в базах данных. Контракт для столбца с автоинкрементом заключается в том, что когда добавляется новый id, он последовательно следует предыдущему наибольшему значению и , что все значения id гарантированно будут уникальными. Нет гарантии, что последовательность будет непрерывной.

Если вам требуется непрерывная последовательность, то вы можете использовать аналитическую функцию ROW_NUMBER (MySQL 8+ и более поздние версии):

SELECT *, ROW_NUMBER() OVER (ORDER BY num_id) rn
FROM web_file;

В более ранней версии MySQL вы могли использовать коррелированный подзапрос:

SELECT *,
    (SELECT COUNT(*) FROM web_file w2 WHERE t2.num_id <= t1.num_id) rn
FROM web_file t1;
...