我要一次插入多组数据,例如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行吗?

评论

主持人注:请在本meta帖子中进行所有有关此问题的优缺点的讨论。

对于oracle sql,请参见stackoverflow.com/a/93724/1452172

@ Chinggis6是的,可能很小,只需对列值使用select:

将@ Chinggis6插入配置文件(名称,描述)中,首先从用户中选择“自动生成”,您似乎会混淆插入和更新语句,这是不同的野兽。

@ Chinggis6啊,我明白了。好吧,我只建议您使用标准的insert ... select语法,它可以为您提供所需的一切,并且具有所希望的灵活性。 dev.mysql.com/doc/refman/5.5/en/insert.html

#1 楼

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

例如:

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


评论


并且请注意,一个插入语句中的最大行数为1000。

–哭泣
13年3月21日在13:39

应该这样写:“一个VALUES子句中的最大行数为1000”。不是INSERT语句限制为1000行。

–阿农
2013年12月19日17:58



我知道这个问题和答案很老,但是我想提一提,使用问题和答案中提到的方法在功能上有区别。第一个执行触发器X次,插入表中有1条记录。第二个执行触发器1次,插入的表中有x条记录。假设您使触发器能够与批处理插入一起正确工作,则使第二种方法成为性能的最佳选择。

–爱德温·斯托特勒
14-4-24在12:07



这不适用于SQL Server 2005,请参阅stackoverflow.com/questions/2624713/…

–pkr298
14年4月28日在16:40

T-sql中的@ahnbizcad分号通常是可选的,但据说将来会需要它们。您应该养成使用它们来终止每个语句的习惯-IMO也会使您的代码看起来更好。

– NReilingh
2015年12月9日,下午3:51

#2 楼

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

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


评论


从SQL Server 2008开始,如果您将双引号替换为单引号,则此方法将起作用。

–华伦天奴·弗兰肯(Valentino Vranken)
2012年3月22日13:37

也适用于postgres v9.0

–嫌疑犯
13年13月13日在10:19

并使用SQLite

–MichałK
2013年12月9日上午10:13

仅SQLite 3.7.11起。如果不能保证,请使用此处显示的UNION方法:stackoverflow.com/a/5009740/841830

–达伦·库克(Darren Cook)
2014年2月13日,1:12

Muneem,每个INSERT语句的限制为1,000 VALUE行。

–约翰·皮塔维(John Pittaway)
18年2月22日在18:02

#3 楼

注意:此答案适用于SQL Server2005。对于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条记录应该很好。

评论


第一次尝试工作,谢谢!我什至可以添加其他内容,例如:'Before date:'+ date2str(GETDATE())+'date after。我知道这是一个奇怪的命令和date2str,但是在我的数据库中是特殊语法。

–迈克尔·拉尔森(Michael Larsson)
8月19日在16:20



#4 楼

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

示例:

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


评论


一个更好的问题是您为什么要这么做?为什么不整批同时运行清洁器4命令。如果一行失败,则批处理将失败。如果将它们分别进行分组,则4个中的3个成功。

– M T Head
16年9月7日在16:41

@ m-t-head我有一个为什么要这么做的例子,并会给你两个原因。我将插入具有数据完整性检查触发器的表中。原因1-单独插入值将违反完整性检查,因此回滚事务并返回错误。我正在使用不支持延迟约束的SQL Server,因此,即使不是触发条件,它也是常规约束,它仍然无法正常工作。原因2-完整性检查是一个昂贵的过程,我宁愿执行一次,而不是每次事务处理1000次。我仍在寻找解决方案。

– tomosius
17年1月21日在6:36

您可以创建一个CTE,并使用insert插入YourTable(ID,名称),从选择ID,名称,从CTE

–穆罕默德·法拉哈尼(Mohammad Farahani)
17年7月25日在5:15

那这个问题呢? stackoverflow.com/questions/51763204/…基本上相同的关注点,但是具有在重复记录的情况下进行更新的功能

–DayIsGreen
18年8月9日在9:56

@ m-t-e-head实际上,主要原因是性能。如果将成捆的行捆绑成合理大小的批处理,并且每批使用一个INSERT,则插入几千或几百万行的速度会更快。

–解码器
18/09/13在18:46