【发布时间】:2019-11-19 19:00:24
【问题描述】:
您好,我在 SQlite3 上遇到了以下问题
我有一张简单的桌子
CREATE TABLE TestTable (id INT, cnt INT);
表中已有一些行。
我有一些数据要插入到表中:{(id0, cnt0), (id1, cnt1)...}
我想往表中插入数据,id冲突,更新TestTable.cnt = TestTable.cnt + value.cnt
(values.cnt是cnt0,cnt1 ...基本上是我要插入的数据)
*** 但是问题是,id没有primary或者unique约束,我是不允许改的!
我目前拥有的:
在我的程序中,我遍历所有值
UPDATE TestTABLE SET count = count + value.cnt WHERE id = value.id;
if (sqlite3_changes() == 0)
INSERT INTO MyTable (id, cnt) values (value.id, value.cnt);
但问题是,对于一个非常大的数据集,对每个数据条目执行 2 次查询需要太长时间。我正在尝试将多个条目捆绑到一个调用中。
如果您对我的描述有任何疑问,请告诉我,谢谢您的帮助!
【问题讨论】:
-
在列上创建一个临时唯一索引。
-
请详细说明“不允许更改”,因为这肯定会限制优化流程的可能解决方案。不允许执行任何 DDL 语句吗?您是否允许创建正式的临时表(使用 TEMPORARY 关键字)?因为 sqlite 没有“临时索引”,Shawn 的建议需要实际添加,然后删除索引......这会与您的限制相矛盾吗?