SQL Lite пустой идентификатор строки даже после удаления строки - PullRequest
3 голосов
/ 29 декабря 2011

У меня есть файл БД SQLite, скажем, a.db. И у меня есть 100 строк в таблице а. Когда я даю

SELECT * FROM a WHERE rowid BETWEEN 1 AND 100

это дает мне первые 100 результатов. Теперь, если я удаляю первые 2 строки из таблицы и запускаю

SELECT * FROM a WHERE rowid BETWEEN 1 AND 100 

это дает мне только 98 строк. И когда я даю запрос

SELECT * FROM a WHERE rowid = 1 

это дает мне пустую строку. База данных, похоже, не переставляет rowid.

Пожалуйста, помогите .. Есть ли способ заставить SQLite переставить идентификаторы строк?

Ответы [ 2 ]

1 голос
/ 29 декабря 2011

В SQLite rowid - это просто столбец типа int со автоинкрементными значениями .Вам гарантировано только то, что каждый rowid будет уникальным для этой таблицы - ничего более.Вы не гарантированы, что rowids будут последовательными, и вы даже не гарантированы, что будет использоваться каждое число!Например, если выполнить INSERT не удалось, идентификатор строки, использованный в этой неудачной вставке, вероятно, будет пропущен и никогда не будет использоваться снова (если явно используется ключевое слово autoincrement - в противном случае, если строка удалена, ее идентификатор строки можно использовать повторнолюбыми вновь вставленными данными.)

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

0 голосов
/ 06 ноября 2012

Я узнал ответ.Нам нужно запускать запрос Vacuum после каждого удаления.Это переставит весь индекс строки и удалит мертвые строки.

http://sqlite.org/lang_vacuum.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...