On 4/4/19 2:07 AM, Arthur Blondel wrote: > Hello > > When I try to insert new data to a full SQLite database, I need to remove > much more than really needed. I'm doing the following: > > while(1) { > do { > status = insert_1_row_to_db(); > if (status == full) { > remove_one_row_from_db(); > } > } while (status == full);} > > The inserted data has always the same size. When the database is full, > removing only one row is enough to insert the new one. But after a while, I > need to remove 30, 40 and even more the 100 rows to be able to insert one > new row. Is it the correct behavior of SQLite? Is there a way to remove > only what is needed and no more? Thanks
As people say, this isn't a good description of the problem, and I suspect that your statement of 'same size' is a big part of the issue. Did you realize that the size of a row can be affected by the values being inserted into it? This means that if you do have an upper limit to the size of the database, and need to delete some data to make room for more, if you don't vacuum the database to squeeze out the holes in the database, you will need to delete a row that is big enough to store the new row to have room to store it. After that, you may have room to store a number of new rows that fit within the gaps you left behind. Vacuuming a database can be a slow operation, because it basically needs to copy the whole database into a new copy, squeezing out the gaps as it goes. It also says you need space on your system for the two copies of the database, so if that is the critical issue, might not be feasible. Vacuuming, if practical, is the best way to (after you delete something) to make room in the database, as it can bring together all the odd holes from the various pieces of deleted data. -- Richard Damon _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users