увеличение строки базы данных Android sqllite при вставке - PullRequest
1 голос
/ 12 марта 2012

В моей базе данных есть таблица с одним полем, объявленным как

_id integer primary key

Нет AUTOINCREMENT.

Здесь у меня есть сомнения относительно того, как rowid будет обновляться во время вставки послеудалять.то, что я заметил, это

  1. , если идентификатор последней строки равен x и он удален, следующая вставленная строка получает идентификатор x.

Но если я удаляю некоторые другие строки сid

Пожалуйста, подтвердите, что мое право наблюдения (rowid используется повторно, только если последние строки удалены, а не между рядами.)

Я видел объяснение AUTOINCREMENT.Я хочу знать поведение, когда не установлено AUTOINCREMENT

Ответы [ 2 ]

3 голосов
/ 12 марта 2012

Ключевое слово AUTOINCREMENT не требуется для таблиц SQLite для автоматического создания значений первичного ключа. все, что вы добавите в базу данных, будет добавлено как последняя строка ... так что, если вы удалите последнюю строку (x) .. новый элемент будет добавлен в позиции x .. если вы удалите из середины или нет .. новый элемент на сложение пойдет в положение х + 1 ...

при использовании автоинкремента .. если вы удалите последний элемент в позиции x, следующий идентификатор x + 1 будет сгенерирован алгоритмом автоинкремента. Сделайте следующее добавление в позиции x + 1 ..

3 голосов
/ 12 марта 2012

Без набора автоинкремента строка будет псевдонимом для ROWID ...

Это то, что часто задаваемые вопросы говорят:

Если ROWID не указан на вставке, или еслиуказанный ROWID имеет значение NULL, затем соответствующий ROWID создается автоматически.Обычный алгоритм должен дать вновь созданной строке ROWID, который больше, чем самый большой ROWID в таблице до вставки.Если таблица изначально пуста, то используется ROWID, равный 1.Если наибольший ROWID равен наибольшему возможному целому числу (9223372036854775807), то ядро ​​базы данных начинает выбирать случайные ROWID-кандидаты случайным образом, пока не найдет тот, который ранее не использовался.Если после разумного количества попыток не может быть найдено неиспользованного ROWID, операция вставки завершается с ошибкой SQLITE_FULL.Если никакие отрицательные значения ROWID явно не вставляются, то автоматически генерируемые значения ROWID всегда будут больше нуля.

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

...