@fukenrice2_0

Как производить переиндексацию в таблице SQLite?

В таблице имеется столбец id, который является первичным ключом. Можно ли при удалении случайной записи из таблицы их переиндексировать так, чтобы индексы продолжали идти подряд и не было пробелов вроде id=1,id=2,<эту запись удалили>, id=4(тут у всех записей после удаленной сдвинуть индексы на 1 назад). Заранее благодарю за ответы
  • Вопрос задан
  • 60 просмотров
Пригласить эксперта
Ответы на вопрос 3
sergey-gornostaev
@sergey-gornostaev Куратор тега SQL
Седой и строгий
Во-первых, индексация - это не то, что вы описали. Во-вторых, смысл идентификаторов как раз в том, чтобы они никогда не менялись.
Ответ написан
Комментировать
@Akina
Сетевой и системный админ, SQL-программист.
Вопрос - следствие абсолютного непонимания сути первичного индекса.

Первичный индекс определяется в таблице для того, чтобы однозначно идентифицировать запись в течение всего времени жизни таблицы.

Обрати особое внимание - в течение времени жизни именно таблицы. Не записи! То есть то, что запись удалена, ни на что не влияет - отсутствующее значение первичного индекса идентифицирует факт, что запись существовала, но была удалена.

Если тебе очень нужна непрерывная нумерация записей - то для реализации этой функции следует создать дополнительное поле в таблице, и уже в нём заниматься нумерациями, перенумерациями и сжатиями. Или (что более правильно), рассчитывать такое значение непосредственно в запросе, в тот момент, когда это значение потребовалось. А с учётом того, что в подавляющем большинстве случаев на это значение никакой функции, кроме удобства просмотра, не возлагается, его можно вообще не считать. Как правило, средства отображения набора записей на клиенте имеют встроенную функцию нумерации записей по порядку - вот и пользуйся.
Ответ написан
Комментировать
@rPman
В ответах все правильно сказали, но не дали собственно решения, вот оно:
заведи поле num, в котором будет размещаться порядковый номер записи, при запросе записей делай group by num

при каких то модификациях порядка (удаление или например вставка в середину порядка записи) делай номер с половинкой (например вставить запись между 3 и 4, то num пусть будет 3.5) и обновляй порядок
update table set
num = ROW_NUMBER () OVER ( ORDER BY num ) RowNum
...


кстати вместо половинчатых номеров можно сначала сдвинуть все номера больше нужного (например вставить 3-им, добавляешь условие where num>3 а потом вставлять.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы