删除排序的sqlite列中的编号间隙



sqlite-db内部是一个具有两个行(ID,start)的表。当表通过启动列排序时,ID必须具有连续的编号。

当前内容的示例:

id {0,44,88,132 ...}开始{0,44,88,132 ...}

我需要的结果:

id {1,2,3,4 ...}并开始{0,44,88,132 ...}

此代码用于校正ID-lumn的作品,但是对于较大的表格,它需要大量时间:

        using (var transaction = conn.BeginTransaction())
        {
            using (var cmdRows = new SQLiteCommand(
                "SELECT Start FROM Tokens ORDER BY Start ASC;", conn))
            {
                using (SQLiteDataReader reader = cmdRows.ExecuteReader())
                {
                    int id = 0;
                    while (reader.Read())
                    {
                        id += 1;
                        var cmdID = new SQLiteCommand(conn);
                        cmdID.CommandText =
                            "UPDATE Tokens SET ID=" + id.ToString() +
                            " WHERE Start=" + reader["Start"].ToString();
                        cmdID.ExecuteNonQuery();
                    }
                }
            }
            transaction.Commit();
        }

生成3个表并在之前直接执行的代码,内容3个循环(1个嵌套,另一个嵌套在嵌套中)。外循环是平行的。福克斯,增加速度2x。但是除上述代码外,它还在大表格中运行的速度问题。借助平行,我无法以连续编号获得ID列的时间顺序。对于串行循环,我不需要上述代码,结果很好,但对于大表格。

目前我唯一可以接受的解决方案是放弃平行。

试图解决的问题的概述是: -

ID不是ROWID。

我有一个令牌仪,该令牌分析文本,我需要一个变量,该变量以文本中的订单编号为单词。

这使得找到一个文本结构,例如显示所有文本部分,其中辅助动词后面是动词的连续形式: e,g: - p>在中,我们现在正在游泳(查找"游泳"),这将是SELECT .... WHERE t1.Attr='aux' and t2.Attr='converb' and t1.id=t2.id-1

可以使用单个SQL语句来完成连续ID:

UPDATE Tokens
SET ID = (SELECT count(*)
          FROM Tokens AS T2
          WHERE T2.Start <= Tokens.Start);

但是,每个条目进行一次更新可能会更快,因为数据库不必对每一行进行计数。

无论如何,这两种算法都需要在Start列上索引有效。

最新更新