假设我有一个数据库表,其中包含三列:id
,field1
和field2
。该表中可能包含100到100,000行。我有一个python脚本,应该在此表中插入10-1,000个新行。但是,如果表格中已存在新的field1
,则应该UPDATE
,而不是INSERT
。
以下哪种方法更有效?
SELECT field1 FROM table
(field1
是唯一的)并将其存储在列表中。然后,对于每个新行,使用list.count()
来确定是INSERT
还是UPDATE
SELECT count(*) FROM table WHERE field1="foo"
然后是INSERT
或UPDATE
。换句话说,执行n + 1个查询和搜索列表,或2n个查询并获取sqlite进行搜索是否更有效?
答案 0 :(得分:9)
如果我理解你的问题,似乎你可以简单地使用SQLite内置的冲突处理机制。
假设你对field1有一个UNIQUE约束,你可以简单地使用:
INSERT OR REPLACE INTO table VALUES (...)
还支持以下语法(相同的语义):
REPLACE INTO table VALUES (...)
编辑:我意识到我并没有真正回答你的问题,只是提供一个应该更快的替代解决方案。
答案 1 :(得分:1)
我不熟悉sqlite,但这样的一般方法应该有效:
如果field1
上有唯一索引,并且您尝试插入已存在的值,则应该收到错误消息。如果插入失败,则进行更新。
伪代码:
try
{
insert into table (value1, value2)
}
catch(insert fails)
{
update table set field2=value2 where field1=value1
}
答案 2 :(得分:0)
我想使用python字典可以比使用python列表更快地进行搜索。 (只需将值设置为0,您就不需要它们,希望紧凑地存储'0'。)
至于更大的问题,我也很好奇。 :)
答案 3 :(得分:0)
您似乎正在将苹果与橙子进行比较。
python列表仅在您的数据适合进程的地址空间时才有用。一旦数据变大,这将不再有效。
此外,python列表未编入索引 - 因此您应该使用字典。
最后,python列表是非持久的 - 当进程退出时会忘记它。
你怎么能比较这些?