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


这个问题在这里已有答案:

我有一组数据要一次插入,比如4行。

我的表有三列: PersonId 和 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");

我可以吗 insert 单个中的所有4行 SQL statement


1340
2018-01-17 05:55


起源


主持人备注:请把所有关于这个问题的优点的讨论带到 这个元文章。 - George Stocker♦
对于oracle sql看 stackoverflow.com/a/93724/1452172 - ono2012
@ Chinggis6是的,非常简单,只需对列值使用select: - Kzqai
@ Chinggis6 insert into profiles (name, description) select first, 'Auto-generated' from users  你似乎混淆了insert和update语句,它们是不同的野兽。 - Kzqai
@ Chinggis6啊我明白了。好吧,我只是建议使用标准 insert ... select 语法,它将为您提供所需的一切,并且可以满足您的需求。 dev.mysql.com/doc/refman/5.5/en/insert.html - Kzqai


答案:


在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');

1775
2018-01-17 07:14



请注意,一个insert语句中的最大行数为1000。 - cryss
这应该是“一行中的最大行数” VALUES 条款是1000“。它不是 INSERT 声明限制为1000行。 - Anon
我知道这个问题和答案都很陈旧,但我想提一下,使用问题中提到的方法和答案之间存在功能差异。第一个执行触发X次,插入表中有1个记录。第二个执行触发1次,插入的表中有x个记录。假设您使用批量插入使触发器正常工作,使第二种方法成为性能的最佳选择。 - Edwin Stoteler
这不适用于SQL Server 2005,请参阅 stackoverflow.com/questions/2624713/... - pkr298
@ahnbizcad T-sql中的分号通常是可选的,但据报道它们将来是必需的。您应该养成使用它们来终止每个语句的习惯 - 您的代码看起来也会更好IMO。 - NReilingh


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

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

704
2018-01-17 06:10



从SQL Server 2008开始,如果用单引号替换双引号,这将起作用。 - Valentino Vranken
也适用于postgres v9.0 - suspectus
并使用SQLite - Michał K
只有SQLite 3.7.11起。如果您无法保证,请使用此处显示的UNION方法: stackoverflow.com/a/5009740/841830 - Darren Cook
Muneem,每个INSERT语句的限制为1,000 VALUE行。 - John Pittaway


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

您可以使用 使用SELECT UNION ALL INSERT

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

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


112
2018-01-17 06:16





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

例:

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

69
2018-04-01 14:07



一个更好的问题是你为什么要这样做?为什么不在一批中一起运行清洁4命令。如果一行失败,则批次失败。如果你把他们分开组合在一起3成功。 - M T Head
@ m-t-head我有一个为什么我想要的例子,并且会给你2个理由。我插入到具有数据完整性检查触发器的表中。原因1 - 单独插入值会违反完整性检查,从而回滚事务并返回错误。我使用的SQL Server不支持延迟约束,所以即使不是触发器它也是常规约束,它仍然无效。原因2 - 完整性检查是一个昂贵的过程,我宁愿执行一次而不是每次事务1000次。我还在寻找解决方案。 - tomosius
您可以创建一个CTE并使用插入到YourTable(ID,名称)中从选择ID,名称来自CTE - Mohammad Farahani