首先,我甚至不确定我是否在问正确的问题,对不起。 SQL对我来说是新的。我有一个我在SQLITE中创建的表,如下所示:
CREATE TABLE ENTRIES "(ID INTEGER PRIMARY KEY AUTOINCREMENT,DATA BLOB NOT NULL)"
如果我只添加条目,那就没关系。如果我创建条目,它们会递增。我们说我添加了7个条目。现在我删除3个条目:
DELETE FROM NODES WHERE ID = 3
DELETE FROM NODES WHERE ID = 4
DELETE FROM NODES WHERE ID = 5
我现在拥有的参赛作品是:
1,2,6,7.
下次添加条目时,它会有ID=8
。
所以,我的问题是:
如何获得接下来的3个条目,获取ID 3,4,5,只有4个条目才能获得8个?我意识到这与SQL: find missing IDs in a table类似,它也可能是一般编程(不仅仅是SQL)问题。所以,我很高兴看到一些Python和SQLite解决方案。
谢谢, 盎司
答案 0 :(得分:0)
我认为这不是自动递增字段的工作方式。 SQLite保留了上次使用的整数的计数器。如果您希望获得后续的3行,它将永远不会“填写”已删除的值 你能做到的身份:
SELECT * FROM NODES WHERE ID > 2 LIMIT 3;
这将为您提供ID大于2的下三行
另外你可以创建一个删除的标志或什么?所以这些行实际上从未从数据库中删除。
答案 1 :(得分:0)
你做不到。出于数据库完整性的原因,SQLite永远不会重复使用已删除的ID。假设你有一个第二个表,它有一个引用第一个表的外键。如果由于某种原因删除了相应的行而没有删除引用它的行(使用主ID),它将指向错误的行。
示例:如果您在不删除购买的情况下删除人员记录,则在重新分配旧ID后,购买记录将指向错误的人。
───────────────────── ────────────────────
Table 1 – customers Table 2 – purchase
───────────────────── ────────────────────
*ID <───────┐ *ID
Name │ Item
Address └─────── Customer
Phone Price
这就是为什么几乎任何数据库引擎都会严格指定主ID。它们是数据库内部,通常不应该触摸它们。如果您需要分配自己的ID,只需添加一个单独的列(在执行此操作之前请三思)。
如果您想跟踪行数,可以像下面这样查询:SELECT Count(*) FROM table_name
。