Как убедиться, что удаленные идентификаторы строк заменены идентификаторами строк, которые следуют за ними? Вот пример:
CREATE TABLE test_table (
test_id INTEGER PRIMARY KEY,
test_name TEXT NOT NULL
);
INSERT INTO test_table (test_name)
VALUES ('A', 'B', 'C', 'D', 'E', 'F');
DELETE FROM test_table WHERE test_name = 'C';
Теперь результаты такие:
Как сделать, чтобы строки, следующие за удаленной строкой, закрывали неиспользуемый идентификатор строки перед ними? Что-то вроде этого:


Вы не хотите этого делать. Во-первых, rowid — это внутренний идентификатор строки в таблице. Он отображается для пользователей, но его цель — предоставить уникальный идентификатор, а не номер без пропусков.
Во-вторых, если вам нужен номер без пропусков, просто используйте row_number():
select t.*, row_number() over (order by test_id) as gapless_test_id
from test_table t;
Почему изменение идентификатора в куче строк — плохая идея? Столбец rowid обычно является первичным ключом в таблице, где он определен. Первичный ключ должен быть стабильным. Его можно использовать для ссылок на внешние ключи в других таблицах. Вам не нужно изменять все таблицы в базе данных только потому, что вы удалили строку в одной из центральных таблиц.
Кроме того, первичные ключи должны быть стабильными во времени. Если вы заметили, что test_id = 3 имеет какое-то конкретное свойство, вы хотите, чтобы «3» завтра ссылалась на ту же строку.
Какую проблему вы пытаетесь решить? Почему наличие пробелов может быть проблемой? Изменение сверхурочной работы id для той же записи обычно является очень плохой идеей. (хотя иногда возможно повторное использование старых неиспользуемых идентификаторов)