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

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

然而,当我尝试这样做时,我得到了一个错误。是否可以在SQLite数据库中一次插入多行?这样做的语法是什么?


当前回答

如果您使用Sqlite管理器firefox插件,它支持从INSERT SQL语句批量插入。

事实上,它不支持这一点,但Sqlite浏览器做(适用于Windows, OS X, Linux)

其他回答

更新

正如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条河流的回复,因为它先提出了解决方案。

你可以使用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已弃用

我编写了一些ruby代码,从一系列插入语句中生成一个500个元素的多行插入,这比运行单个插入快得多。然后我尝试简单地将多个插入打包到一个事务中,发现我可以用更少的代码获得同样的速度。

BEGIN TRANSACTION;
INSERT INTO table VALUES (1,1,1,1);
INSERT INTO table VALUES (2,2,2,2);
...
COMMIT;
INSERT INTO tabela(coluna1,coluna2) 
SELECT 'texto','outro'
UNION ALL 
SELECT 'mais texto','novo texto';

是的,sql可以做到这一点,但是使用不同的语法。顺便说一下,sqlite文档非常好。它还会告诉您插入几行的唯一方法是使用select语句作为要插入的数据的源。