sqlite — необходимо удалить более одной строки, чтобы добавить новую строку, когда база данных заполнена

#c #sqlite

#c #sqlite

Вопрос:

Когда я пытаюсь вставить новые данные в полную базу данных SQLite, мне нужно удалить гораздо больше, чем действительно необходимо. Я делаю следующее:

 while(1) {
    do {
        status = insert_1_row_to_db();
        if (status == full) {
            remove_one_row_from_db();
        }
    } while (status == full);
}
  

Вставленные данные всегда имеют одинаковый размер.
Когда база данных заполнена, достаточно удалить только одну строку, чтобы вставить новую. Но через некоторое время мне нужно удалить 30, 40 и даже более 100 строк, чтобы иметь возможность вставить одну новую строку.
Правильное ли это поведение SQLite?
Есть ли способ удалить только то, что необходимо, и не более?
Спасибо

Комментарии:

1. Да, это ожидаемо, нет прямой корреляции между фактическим размером самих данных и размером файла на диске. Удаление строки пометит эту область файла как «свободную» для использования в будущем — если бы это было не так, файл нужно было бы реорганизовывать и переписывать при каждом изменении. Команда vacuum объясняет это далее. (Это не значит, что вы должны очистить, чтобы смягчить это)

2. Я не говорю о размере файла. Я говорю, что для добавления новой строки в базу данных, скажем, 100 байт, когда база данных заполнена, иногда достаточно удаления 100 байт, но иногда мне приходится удалять 3000 или 5000 байт.

3. Но под «DB заполнена» вы подразумеваете, что размер ее файла находится на некотором верхнем пределе?

4. Да, я ограничил размер файла с помощью pragma max_page_count