2

我之前使用过 SQLite,并且在循环中使用 Insert 添加多行for很慢。解决方案是使用transaction.

现在我SQLiteAsyncConnection在 SQLite.Net(用于 ORM)中使用,我也尝试使用transaction. 它有效,但只有一个问题。插入顺序不是数据的顺序。

Database.RunInTransactionAsync(
    (SQLiteConnection conn) => {
        foreach (var row in rows)
        {
            conn.InsertOrReplace(row);
        }
        conn.Commit();
    }
);

如果rows包含 [1,2,3,4,5,6],则数据库中的行类似于 [3,1,2,6,4,5]。我怎样才能保持原来的订单?

请注意,我仅指新插入的行。即使代码正在替换现有行,但在测试时数据库中没有要替换的现有行。

PS:该行的ID字段是[PrimaryKey],但rows在行中没有排序ID。似乎在数据库中的行是按ID. 我不希望它被排序,ID但要保持原始顺序。

PS 2:我需要知道ID最后插入的行。当使用类似的 GUI 工具查看数据库DB Browser for SQLite或获取最后一项时LIMIT 1,SQLite 似乎已自动对行进行排序ID。我做了一些谷歌搜索,它按照SQL的规则说,当没有时ORDER BY,返回的行的顺序不保证是物理顺序,无论如何。我应该创建另一个字段并将其设置为主要的自动增加字段吗?

目前,ID保证每行唯一,但“ID”是数据本身的一部分,而不是专门添加用于数据库的字段。

4

1 回答 1

0

SQL 表在逻辑上是无序的,所以如果你想要一个特定的顺序,你总是必须在查询中使用 ORDER BY。

如果您的数据不包含任何与插入顺序相对应的值(例如时间戳),那么您必须使用rowid,即添加一个声明为 INTEGER PRIMARY KEY 的列。

于 2017-11-05T06:33:13.277 回答