1

首先,我什至不确定我是否问对了问题,对此感到抱歉。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 解决方案。

谢谢,奥兹

4

2 回答 2

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.

于 2012-10-08T16:11:19.977 回答
0

我不认为这是自动递增字段的工作方式。SQLite 保留最后使用的整数的计数器。如果您想在 id 之后获取接下来的 3 行,它永远不会“填充”已删除的值:

SELECT * FROM NODES WHERE ID > 2 LIMIT 3;

这将为您提供 ID 大于 2 的接下来的三行

此外,您可以创建一个已删除的标志或其他东西吗?所以这些行实际上永远不会从您的数据库中删除。

于 2012-10-08T15:47:27.633 回答