【问题标题】:How to reindex or fix rowid after a row is deleted sqlite?删除行后如何重新索引或修复rowid sqlite?
【发布时间】:2013-12-30 13:49:09
【问题描述】:

好吧,我的处境相当艰难,或者至少我是这么认为的。我一直在研究如何解决我的问题,但实际上是空手而归。

删除一行后,我需要能够重新索引表的 rowid。这样,当我想通过 rowid 更新或索引行时,它正在访问正确的行。

现在让你们问为什么。基本上,我正在连接一个用 C 语言编程的“自制”数据库,实际上只是一堆内存位置,它们都像数据库表一样被访问。所以我想说的是他们可以通过在表中搜索一个值来查找一行,或者只是说我想要第 6 行。最后,表可以包含任何东西,以及任何意味着他们不创建的值一列作为索引,最终我唯一能按行号索引他们的行是我所知道的 rowid。

所以我发现 VACUUM 会做我想要或需要的事情,但似乎数据库所在的系统没有授予 sqlite 写入权限,因此当 VACUUM 运行时它会返回并出现错误。 (错误 14 或无法打开数据库文件)(我也知道我的数据库是打开的,所以这不是问题,但没有写权限是我能想到的唯一原因)我还阅读了一些关于自动增量或类似的东西,但并不真正理解/认为这将能够解决我的问题。

任何来自 sqlite 或数据库天才的建议或想法都将不胜感激。

【问题讨论】:

    标签: c++ sql database sqlite


    【解决方案1】:

    不确定我是否完全理解了您的问题,但如果您可以使用 SQL 代码,也许您可​​以编写一个查询来更新 ID(假设它们是密集的顺序)。

    您可以使用这样的查询:

    UPDATE t1
    SET id = (SELECT rank 
                     FROM (SELECT id, 
                                  (
                                      SELECT count()+1 
                                        FROM (SELECT DISTINCT id 
                                                FROM t1 AS t
                                               WHERE t.id < t1.id
                                             ) 
                                  ) rank
                             FROM t1
                           ) AS sub
     WHERE sub.id = t1.id
    );
    

    您可以在SQLFiddler 中查看我的演示。在此演示中,如果您一起运行所有查询,您将看到 DELETEUPDATE 语句的结果(模拟您的情况)。

    【讨论】:

    • 不知道为什么我没有想到只更新 rowid 列:/ 无论如何,我认为我不知道如何编写查询。非常感谢。
    猜你喜欢
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多