在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数据库中一次插入多行?这样做的语法是什么?
当前回答
从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
其他回答
如果你正在使用bash shell,你可以使用这个:
time bash -c $'
FILE=/dev/shm/test.db
sqlite3 $FILE "create table if not exists tab(id int);"
sqlite3 $FILE "insert into tab values (1),(2)"
for i in 1 2 3 4; do sqlite3 $FILE "INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5"; done;
sqlite3 $FILE "select count(*) from tab;"'
或者如果你在sqlite CLI中,那么你需要这样做:
create table if not exists tab(id int);"
insert into tab values (1),(2);
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
select count(*) from tab;
它是如何工作的? 它使用if表选项卡:
id int
------
1
2
然后从TAB a中选择a.id, b.id, TAB b返回
a.id int | b.id int
------------------
1 | 1
2 | 1
1 | 2
2 | 2
等等。第一次执行后,插入2行,然后2^3=8。(三个,因为我们有TAB a TAB b TAB c)
在第二次执行之后,我们插入额外的(2+8)^3=1000行
第三次之后,我们插入大约max(1000^ 3,5e5)=500000行,依此类推……
这是我所知道的填充SQLite数据库的最快方法。
根据本页,不支持:
2007-12-03:不支持多行插入,也就是复合插入。
INSERT INTO table (col1, col2) VALUES
('row1col1', 'row1col2'), ('row2col1', 'row2col2'), ...
实际上,根据SQL92标准,VALUES表达式应该能够独立存在。例如,下面应该返回一个三行的单列表:VALUES 'john', 'mary', 'paul';
从3.7.11版本开始,SQLite支持多行插入。Richard Hipp评论道:
新的多值插入词仅仅是该复合词的句法糖(sic) 插入。无论如何,这都没有性能优势。”
如果您使用Sqlite管理器firefox插件,它支持从INSERT SQL语句批量插入。
事实上,它不支持这一点,但Sqlite浏览器做(适用于Windows, OS X, Linux)
从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
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)