2012-04-10 49 views
7

我想在某个表中使用SQLite3外壳插入15530记录,但我得到那个错误,我搜索了解决方案SQLITE_MAX_COMPOUND_SELECT默认为500是原因,但我没有知道如何使用Shell来更改它。SQLite插入大量记录时发生的问题

“错误:在复合太多方面选择”

http://desmond.imageshack.us/Himg861/scaled.php?server=861&filename=sqlite.jpg&res=landing

INSERT INTO table_name (my_id, my_name) VALUES 
(1, 'Aaliyah'), 
(2, 'Alvar Aalto'), 
(3, 'Willie Aames'), 
... 
(15530, 'name'); 
+1

SQLITE_MAX_COMPOUND_SELECT设置不是你的问题。 *您需要减少SELECT语句中的术语数量。*向我们显示您正在使用的代码。 – 2012-04-10 05:52:38

+1

@RobertHarvey,那是解决方案。但是,硬编码的限制/数组大小,同时防止开发人员变得疯狂甚至比替代方案更具性能,这对他们自己的权利是可惜的。它不像是sqlite有一个相当于'xargs'来自动将大量插入到最大可能的(或最常见的有效大小)的语句...(或者它是否?) – binki 2015-01-15 15:16:49

回答

4

INSERT INTO没有这样的。

试试这个:

BEGIN TRANSACTION 
INSERT INTO author (author_id, author_name) VALUES (1, 'Aaliyah') 
INSERT INTO author (author_id, author_name) VALUES (2, 'Alvar Aalto') 
INSERT INTO author (author_id, author_name) VALUES (3, 'Willie Aames') 
... 
END TRANSACTION 

http://www.sqlite.org/lang_insert.html

+0

谢谢,这真的让我有不同的想法,并重写查询与此相匹配 – enGMzizo 2012-04-10 06:21:49

+7

恩,是的,它的确如* 3.7.11版那样工作。不再需要使用旧的方式将行插入到事务的单独插入中。那么为什么新的方式声称我们正在做一个复合选择,当这不再是真实的(查询有“选择”无处!)? – Michael 2014-10-07 04:31:40

14

多值的INSERT INTO语法为introduced in SQLite 3.7.11,所以原来的语法是最新版本的SQLite的罚款。在旧版本中,您可以使用alternative syntax

但是,限制SQLITE_MAX_COMPOUND_SELECTcannot be raised at runtime,所以你需要将你的插入分成500行的批次。这比每个查询插入一行更有效。例如。

BEGIN; 
INSERT INTO table_name (id, name) VALUES (1, 'foo'), ..., (500, 'bar'); 
INSERT INTO table_name (id, name) VALUES (501, 'baz'), ..., (1000, 'zzz'); 
... 
COMMIT; 
+4

为什么SQLite将多重插入作为一个选择,当语法完全消失时呢?这是没有道理的,特别是根据文件说:“我们认为这是一个慷慨的分配,因为在实践中,我们几乎从来没有看到复合选择中的术语数超过单个数字。”但事实上,我可能有数千或数百万行我想插入一个语句! – Michael 2014-10-07 04:29:41

+1

@Michael,如果你使用的是sqlite3,你应该期待这样的事情,因为这就是sqlite3的重点:轻量级即使这意味着排除了重量级DB中的某些便利。这使得硬编码的数组维度可以在这样的库中被用户接受,甚至在重量级数据库中,您可能仍然希望将具有大VALUES部分的INSERT拆分为多个INSERT。 – binki 2015-01-15 15:23:50