之前我使用过SQLite,在for
循环中使用Insert添加多行很慢。解决方案是使用transaction
。
既然我在SQLite.Net中使用SQLiteAsyncConnection
(对于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
。使用DB Browser for SQLite
之类的GUI工具查看数据库或通过LIMIT 1
获取最后一项时,似乎SQLite已自动按ID
对行进行排序。我做了一些Google搜索,并且根据SQL的规则说,当没有ORDER BY
时,返回行的顺序无论如何都不能保证是物理顺序。我应该创建另一个字段并将其设置为主要的自动增加字段吗?
目前,ID
每行保证唯一,但ID'是数据本身的一部分,而不是专门为数据库使用而添加的字段。
答案 0 :(得分:0)
SQL表在逻辑上是无序的,因此如果您需要某个订单,则始终必须在查询中使用ORDER BY。
如果您的数据不包含与插入顺序对应的任何值(例如,时间戳),则必须使用rowid,即添加声明为INTEGER PRIMARY KEY的列。