小编典典

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

all

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

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

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


阅读 118

收藏
2022-03-06

共1个答案

小编典典

更新

正如指出的那样, SQLite3.7.11 及更高版本现在支持原始帖子的更简单语法 。但是,如果您希望在旧数据库之间实现最大兼容性,则显示的方法仍然适用。

原始答案

如果我有特权,你 可以 在 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 加载大型数据集,尚不清楚这是否可以更快地将个人包装INSERTs在单个事务中:

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

如果效率是你的目标,你应该先试试这个。

关于 UNION 与 UNION ALL 的注释

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

2022-03-06