I’m using a SQlite database and Django’s QuerySet API to access this database. I wrote data sequentially into the database and each entry has a simple ID as the primary key (this is the Django default). This means that there is a continuous sequence of IDs now in the database (entry 1 has ID 1, entry 2 has ID 2, and so on). Now I needed to delete some entries again. This means that the sequence of IDs is discontinuous now (entry 1 has ID 1, but entry 2 might have ID 3, 8, 1432 or anything else, but not 2).
How can I restore this continuous sequence of IDs again and associate them with the remaining entries in the database? Is there a way to do this with Django’s QuerySet API or do I need to use plain SQL? I have no experience with plain SQL, so some working code would be very helpful in this case. Thank you!
I cannot think of any situation in which doing this would be desirable. The best primary keys are immutable (although that’s not a technical requirement) and the very purpose of using non-meaningful integer primary keys is to avoid having to update them.
I would even go so far as to say that if you require a meaningful, unbroken sequence of integers, create a separate column in your table, keep the primary key with its sequence breaks, and renumber the new “sequence” column when needed.
However, you may have requirements that I can’t think of. If you really need to change the values in those keys make sure that all the references to that column in your database are protected by FOREIGN KEY constraints and check out the ON UPDATE CASCADE option when you declare a foreign key. It will instruct the database to do the updating for you.
But if you don’t have to this, don’t.