是否可以在SQLite数据库中一次插入多行?

在MySQL中,你可以像这样插入多行:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
    ('data1', 'data2'),
    ('data1', 'data2'),
    ('data1', 'data2'),
    ('data1', 'data2');

但是,当我尝试执行此类操作时,出现错误。 是否可以在SQLite数据库中一次插入多行? 这是什么语法?


更新

正如BrianCampbell在这里指出的那样, SQLite 3.7.11及更高版本现在支持原始文章的更简单的语法 。 但是,如果您希望跨遗留数据库达到最大兼容性,则所示方法仍然适用。

原始答案

如果我有权限,我会碰到andy的回复:你可以在SQLite中插入多行,你只需要不同的语法 。 为了使它完全清楚,OP的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指出的那样,目前还不清楚在单个事务中是否有更快的包装单个INSERTs

BEGIN TRANSACTION;
INSERT INTO 'tablename' table VALUES ('data1', 'data2');
INSERT INTO 'tablename' table VALUES ('data3', 'data4');
...
COMMIT;

如果效率是您的目标,那么您应该先尝试一下。

一个关于联盟vs联盟所有的说明

正如几个人所评论的,如果你使用UNION ALL (如上所示),所有的行都会被插入,所以在这种情况下,你会得到四行data1, data2 。 如果你省略了ALL ,那么重复的行将被消除(操作可能会慢一点)。 我们使用UNION ALL,因为它更贴近原始帖子的语义。

关闭

PS:请+1安迪的回复,不是我的! 他首先提出了解决方案。


是的,这是可能的,但不是通常用逗号分隔的插入值。

尝试这个...

insert into myTable (col1,col2) 
     select aValue as col1,anotherValue as col2 
     union select moreValue,evenMoreValue 
     union...

是的,这有点难看,但很容易从一组值中自动生成声明。 此外,它似乎只需要在第一个选择中声明列名称。


是的,从SQLite 3.7.11开始,SQLite支持。 从SQLite文档:

SQLite INSERT语句语法

(当这个答案最初被写入时,这不被支持)

为了与旧版本的SQLite兼容,你可以使用使用UNION的andy和fearless_fool建议的技巧,但对于3.7.11和更高版本,这里描述的更简单的语法应该是首选。

链接地址: http://www.djcxy.com/p/3331.html

上一篇: Is it possible to insert multiple rows at a time in an SQLite database?

下一篇: Are there known issues with using sqlite and file locking on different platforms?