提问人: 提问时间:1/17/2009 最后编辑:Doctor Jones 更新时间:10/17/2019 访问量:3314127
在单个 SQL 查询中插入多行?[复制]
Inserting multiple rows in a single SQL query? [duplicate]
问:
我一次要插入多组数据,比如 4 行。我的表有三列:、 和 。Person
Id
Office
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 行吗?
答:
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 行的语句。VALUES
INSERT
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,则插入数千或数百万行的速度会快得多。
评论
insert into profiles (name, description) select first, 'Auto-generated' from users
insert ... select