sqlite跟踪ID - 查找seq中缺少的整数

时间:2012-10-08 15:44:46

标签: python sqlite

首先,我甚至不确定我是否在问正确的问题,对不起。 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解决方案。

谢谢, 盎司

2 个答案:

答案 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