删除sqlite后如何重新索引或修复rowid?

时间:2013-12-30 13:49:10

标签: c++ sql database sqlite

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

删除行后,我需要能够重新索引表格的rowid。这种方式在任何给定的时间,当我想通过rowid更新或索引行时,它正在访问正确的行。

现在,对于那些问你原因的人。基本上我正在连接一个用C编程的“自制”数据库,它实际上只是一堆内存位置,所有访问都像db表一样。所以我想说的是他们可以通过在表中搜索一个值来查找一行,或者简单地说我想要第6行。最后,表可以包含任何内容,以及任何意味着他们不创建的值作为索引的列,最终我唯一能够逐行索引的是我所知道的rowid。

所以我发现VACUUM可以做我想要的或者需要的但是看起来数据库所在的系统没有提供sqlite权限来写,所以当VACUUM运行时它会带来错误。 (错误14或无法打开数据库文件)(我也知道我的数据库是打开的,这不是问题,但没有写权限是我能想出的唯一原因)我也读过一些关于自动增量或类似的东西,但没有真正理解/认为这将能够解决我的问题。

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

1 个答案:

答案 0 :(得分: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语句的结果(以模拟您的情况)。