在单个 SQL 查询中插入多行?[复制]

Inserting multiple rows in a single SQL query? [duplicate]

提问人: 提问时间:1/17/2009 最后编辑:Doctor Jones 更新时间:10/17/2019 访问量:3314127

问:

我一次要插入多组数据,比如 4 行。我的表有三列:、 和 。PersonIdOffice

INSERT INTO MyTable VALUES ("John", 123, "Lloyds Office");
INSERT INTO MyTable VALUES ("Jane", 124, "Lloyds Office");
INSERT INTO MyTable VALUES ("Billy", 125, "London Office");
INSERT INTO MyTable VALUES ("Miranda", 126, "Bristol Office");

我可以在单个 SQL 语句中插入所有 4 行吗?

sql-server t-sql 插入

评论

10赞 George Stocker 8/22/2013
主持人注:请将所有关于这个问题优点的讨论带到这个元帖子中。
4赞 ono2012 6/26/2014
对于 oracle sql,请参阅 stackoverflow.com/a/93724/1452172
1赞 Kzqai 9/12/2017
@Chinggis6 是的,微不足道,只需对列值使用 select:
2赞 Kzqai 9/12/2017
@Chinggis6 您似乎混淆了插入和更新语句,它们是不同的野兽。insert into profiles (name, description) select first, 'Auto-generated' from users
1赞 Kzqai 9/12/2017
@Chinggis6啊,我明白了。好吧,我只是建议使用标准语法,它会为您提供所需的一切,并且尽可能灵活。dev.mysql.com/doc/refman/5.5/en/insert.htmlinsert ... select

答:

883赞 too much php 1/17/2009 #1

如果要插入到单个表中,则可以像这样编写查询(可能仅在MySQL中):

INSERT INTO table1 (First, Last)
VALUES
    ('Fred', 'Smith'),
    ('John', 'Smith'),
    ('Michael', 'Smith'),
    ('Robert', 'Smith');

评论

60赞 Valentino Vranken 3/22/2012
从 SQL Server 2008 开始,如果将双引号替换为单引号,这将起作用。
21赞 suspectus 11/13/2013
也适用于 postgres v9.0
13赞 Michał Klimczak 12/9/2013
使用 SQLite
7赞 Darren Cook 2/13/2014
只有 SQLite 3.7.11 以上版本。如果不能保证这一点,请使用如下所示的 UNION 方法: stackoverflow.com/a/5009740/841830
5赞 John Pittaway 2/23/2018
Muneem,则限制为每个 INSERT 语句 1,000 行 VALUE。
157赞 DavGarcia 1/17/2009 #2

注意:此答案适用于 SQL Server 2005。对于 SQL Server 2008 及更高版本,有更好的方法,如其他答案所示。

您可以将 INSERT 与 SELECT UNION ALL 一起使用:

INSERT INTO MyTable  (FirstCol, SecondCol)
    SELECT  'First' ,1
    UNION ALL
SELECT  'Second' ,2
    UNION ALL
SELECT  'Third' ,3
...

不过,仅适用于小型数据集,这对于您的 4 条记录来说应该没问题。

评论

0赞 Michael Larsson 8/20/2020
第一次尝试就成功了,谢谢!我甚至可以添加额外的东西,例如:我知道这是一个有点奇怪的 comand date2str,但在我的数据库中是特殊的语法。'Before date: ' + date2str(GETDATE()) + ' after date.'
0赞 Vijay Balebail 8/16/2023
从 Oracle 版本 23c 开始,Oracle 现在也支持 Value 构造函数。
2652赞 BinaryMisfit 1/17/2009 #3

在 SQL Server 2008 中,可以使用单个 SQL INSERT 语句插入多行。

INSERT INTO MyTable ( Column1, Column2 ) VALUES
( Value1, Value2 ), ( Value1, Value2 )

有关此内容的参考,请查看 MOC 课程 2778A - 在 SQL Server 2008 中编写 SQL 查询。

例如:

INSERT INTO MyTable
  ( Column1, Column2, Column3 )
VALUES
  ('John', 123, 'Lloyds Office'), 
  ('Jane', 124, 'Lloyds Office'), 
  ('Billy', 125, 'London Office'),
  ('Miranda', 126, 'Bristol Office');

评论

433赞 cryss 3/21/2013
请注意,一个插入语句中的最大行数为 1000。
219赞 Anon 12/20/2013
这句话应该写成“一个子句的最大行数是1000”。它不是限制为 1000 行的语句。VALUESINSERT
41赞 Edwin Stoteler 4/24/2014
我知道这个问题和答案很旧,但我想提一下,使用问题中提到的方法和这个答案中提到的方法之间存在功能差异。第一个执行触发 X 次,插入的表中有 1 条记录。第二个执行触发器 1 次,插入的表中有 x 条记录。使第二种方法成为性能的最佳选择,前提是您使触发器在批量插入中正常工作。
8赞 pkr 4/29/2014
这不适用于 SQL Server 2005,请参阅 stackoverflow.com/questions/2624713/...
5赞 NReilingh 12/9/2015
@ahnbizcad T-sql 中的分号通常是可选的,但据报告将来需要这些分号。你应该养成使用它们来终止每个语句的习惯——你的代码看起来也会更好 IMO。
92赞 4/1/2009 #4

INSERT使用语法的语句可以插入多行。为此,请包含多个列值列表,每个列表都括在括号内并用逗号分隔。VALUES

例:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

评论

3赞 M T Head 9/8/2016
一个更好的问题是你为什么要这样做?为什么不一次性运行清洁器 4 命令呢?如果一行失败,则批处理将失败。如果将它们单独组合在一起,则 4 个中的 3 个成功。
13赞 tomosius 1/21/2017
@m-t-head,我有一个例子来说明我为什么要这样做,并会给你 2 个理由。我正在插入到具有数据完整性检查触发器的表中。原因 1 - 单独插入值会违反完整性检查,从而回滚事务并返回错误。我使用的是不支持延迟约束的 SQL Server,因此即使它不是触发器而是常规约束,它仍然不起作用。原因 2 - 完整性检查是一个昂贵的过程,我宁愿执行一次,而不是每笔交易执行 1000 次。我仍在寻找解决方案。
1赞 Mohammad Farahani 7/25/2017
您可以创建一个 CTE 并使用 insert into YourTable (ID,Name) From select ID,Name From CTE
0赞 DayIsGreen 8/9/2018
这个问题呢?stackoverflow.com/questions/51763204/......基本相同的关注点,但具有在重复记录的情况下进行更新的功能
3赞 uncoder 9/14/2018
@m-t-e-head 实际上,主要原因是性能。如果将数千或数百万行捆绑在一起,并为每个批处理使用一个 INSERT,则插入数千或数百万行的速度会快得多。