在MySQL中,你可以像这样插入多行:
INSERT INTO 'tablename' ('column1', 'column2') VALUES
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2');
然而,当我尝试这样做时,我得到了一个错误。是否可以在SQLite数据库中一次插入多行?这样做的语法是什么?
在MySQL中,你可以像这样插入多行:
INSERT INTO 'tablename' ('column1', 'column2') VALUES
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2');
然而,当我尝试这样做时,我得到了一个错误。是否可以在SQLite数据库中一次插入多行?这样做的语法是什么?
当前回答
更新
正如BrianCampbell在这里指出的,SQLite 3.7.11及以上版本现在支持原始帖子更简单的语法。但是,如果您希望在遗留数据库之间实现最大的兼容性,则所示的方法仍然是合适的。
原来的答案
如果我有特权,我会bump river的回复:你可以在SQLite中插入多行,你只是需要不同的语法。为了让它更清楚,OPs MySQL的例子:
INSERT INTO 'tablename' ('column1', 'column2') VALUES
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2');
这可以重铸成SQLite为:
INSERT INTO 'tablename'
SELECT 'data1' AS 'column1', 'data2' AS 'column2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'
关于性能的说明
我最初使用这种技术是为了有效地从Ruby on Rails加载大型数据集。然而,正如Jaime Cook指出的那样,在单个事务中封装单个insert并不明显更快:
BEGIN TRANSACTION;
INSERT INTO 'tablename' table VALUES ('data1', 'data2');
INSERT INTO 'tablename' table VALUES ('data3', 'data4');
...
COMMIT;
如果你的目标是提高效率,你应该先试试这个。
关于UNION vs UNION ALL的说明
正如一些人评论的那样,如果使用UNION ALL(如上所示),将插入所有行,因此在本例中,您将得到data1、data2的四行。如果省略ALL,那么重复的行将被消除(并且操作可能会稍微慢一些)。我们使用UNION ALL,因为它更接近原始帖子的语义。
在关闭
附注:请+1条河流的回复,因为它先提出了解决方案。
其他回答
Fearless_fool对于旧版本有一个很好的答案。我只是想补充一下,你需要确保你列出了所有的列。如果你有3列,你需要确保select作用在3列上。
示例:我有3列,但我只想插入2列的数据。假设我不关心第一列因为它是一个标准整数id。我可以这样做……
INSERT INTO 'tablename'
SELECT NULL AS 'column1', 'data1' AS 'column2', 'data2' AS 'column3'
UNION SELECT NULL, 'data3', 'data4'
UNION SELECT NULL, 'data5', 'data6'
UNION SELECT NULL, 'data7', 'data8'
注意:记住“select…”“工会”的声明将失去秩序。(从AG1)
从3.7.11版本开始,SQLite支持多行插入。理查德。 Hipp评论:
我使用的是3.6.13
我这样命令:
insert into xtable(f1,f2,f3) select v1 as f1, v2 as f2, v3 as f3
union select nextV1+, nextV2+, nextV3+
一次插入50条记录,只需要一秒钟或更短的时间。
确实,使用sqlite一次插入多行是非常可能的。作者@Andy写道。
谢谢Andy
你可以使用InsertHelper,它简单快捷
文档: http://developer.android.com/reference/android/database/DatabaseUtils.InsertHelper.html
教程: http://www.outofwhatbox.com/blog/2010/12/android-using-databaseutils-inserthelper-for-faster-insertions-into-sqlite-database/
编辑: 从API级别17开始,InsertHelper已弃用
Alex是正确的:“select…”“Union”语句将失去对某些用户非常重要的排序。即使当您以特定的顺序插入时,sqlite也会更改内容,因此如果插入顺序很重要,则更倾向于使用事务。
create table t_example (qid int not null, primary key (qid));
begin transaction;
insert into "t_example" (qid) values (8);
insert into "t_example" (qid) values (4);
insert into "t_example" (qid) values (9);
end transaction;
select rowid,* from t_example;
1|8
2|4
3|9
更新
正如BrianCampbell在这里指出的,SQLite 3.7.11及以上版本现在支持原始帖子更简单的语法。但是,如果您希望在遗留数据库之间实现最大的兼容性,则所示的方法仍然是合适的。
原来的答案
如果我有特权,我会bump river的回复:你可以在SQLite中插入多行,你只是需要不同的语法。为了让它更清楚,OPs MySQL的例子:
INSERT INTO 'tablename' ('column1', 'column2') VALUES
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2');
这可以重铸成SQLite为:
INSERT INTO 'tablename'
SELECT 'data1' AS 'column1', 'data2' AS 'column2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'
关于性能的说明
我最初使用这种技术是为了有效地从Ruby on Rails加载大型数据集。然而,正如Jaime Cook指出的那样,在单个事务中封装单个insert并不明显更快:
BEGIN TRANSACTION;
INSERT INTO 'tablename' table VALUES ('data1', 'data2');
INSERT INTO 'tablename' table VALUES ('data3', 'data4');
...
COMMIT;
如果你的目标是提高效率,你应该先试试这个。
关于UNION vs UNION ALL的说明
正如一些人评论的那样,如果使用UNION ALL(如上所示),将插入所有行,因此在本例中,您将得到data1、data2的四行。如果省略ALL,那么重复的行将被消除(并且操作可能会稍微慢一些)。我们使用UNION ALL,因为它更接近原始帖子的语义。
在关闭
附注:请+1条河流的回复,因为它先提出了解决方案。