Inserting multiple rows in a single SQL query?
我有多组数据要一次插入,比如说4行。
我的桌子有三列:Person、Id和Office。
1 2 3 4
| 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 statement中全部4行都使用insert吗?
- 主持人注:请把所有关于这个问题优点的讨论都放到这个元帖子里。
- 有关Oracle SQL,请参阅stackoverflow.com/a/93724/1452172
- 使用add.batch dude
- 若要在一行中插入多条记录,也可以尝试以下示例:insert into tablename(col1,col2)select uid,uname from usertable;
- 您还可以使用此查询在单个SQL查询中插入多行。这里是查询:插入到表名1(个人,身份证,办公室)选择"John",1,"Lloyds Office"工会选择"Jane",2,"Lloyds Office"工会选择"Billy",3,"Lloyds Office"工会选择"Miranda",4,"Lloyds Office"
- 据我所知,对于那些希望能够在概念上引用该技术的人来说,该技术的名称并不是特别的,只是insert multiple rows。参考:dev.mysql.com/doc/refman/5.5/en/insert.html
- @kzqai,那么mysql中的insert set col1='val1', col2='val2 (?) col1='val3', col2=val2'呢?我的意思是用MySQL特定的insert set语法插入多行;这是可能的吗?
- @chinggis6是的,非常可能,只需使用一个select作为列值:
- @你能举个例子吗?
- @chinggis6 insert into profiles (name, description) select first, 'Auto-generated' from users您似乎混淆了insert和update语句,这是不同的野兽。
- @KZQAI编号,请重新检查您提供的上述链接。与其他DBS不同,MySQL允许您使用insert和set关键字,而不是values关键字。这是非常特定于MySQL的非标准SQL语句。
- @我明白了。好吧,我只是建议使用标准的insert ... select语法,它将为您提供所需的一切,并且具有所需的灵活性。dev.mysql.com/doc/refman/5.5/en/insert.html版本
- 在MyTable值中插入("John",123,"Lloyds Office"),("Jane",124,"Lloyds Office"),("Billy",125,"London Office"),("Miranda",126,"Bristol Office");
在SQL Server 2008中,可以使用单个SQL INSERT语句插入多行。
1 2
| INSERT INTO MyTable ( Column1, Column2 ) VALUES
( Value1, Value2 ), ( Value1, Value2 ) |
有关这方面的参考,请参阅MOC课程2778A-在SQL Server 2008中编写SQL查询。
例如:
1 2 3 4 5 6 7
| INSERT INTO MyTable
( Column1, Column2, Column3 )
VALUES
('John', 123, 'Lloyds Office'),
('Jane', 124, 'Lloyds Office'),
('Billy', 125, 'London Office'),
('Miranda', 126, 'Bristol Office'); |
- 请注意,一个insert语句中的最大行数是1000。
- 这应该是"一个VALUES子句中的最大行数是1000"。限制在1000行以内的不是INSERT语句。
- @Anon感谢你澄清了Chrisj的误导性评论。把我从痛苦的调试中救了出来。:)
- 我知道这个问题和答案很古老,但是我想说的是,在使用问题中提到的方法和这个答案中提到的方法之间有一个功能上的区别。第一个执行触发器x次,在插入的表中有1条记录。第二个执行触发器1次,在插入的表中有x个记录量。使第二个方法成为性能的最佳选择,前提是使触发器能够正确地使用批插入。
- 这不适用于SQL Server 2005,请参阅stackoverflow.com/questions/2624713/…
- 语句末尾没有分号,而其他答案有分号。你需要还是不需要?
- @T-SQL中的ahnbizcad分号通常是可选的,但据报告它们将来是必需的。您应该养成使用它们终止每个语句的习惯——在我看来,您的代码看起来会更好。
- @我完全不知道。我实际上开始查。下面是指向Microsoft库中T-SQL语法约定的链接,以供参考。我还添加了一个关于这个主题的有趣文章的链接。谢谢!
- 这也比他现在做的慢:stackoverflow.com/questions/8635818/…
- @anon如果您需要1000多行,那么可以在一个CTE中为您的插入联合多个1000行VALUES构造函数。仍然算作一个查询!
- 您知道引入了哪种SQL规范吗?(多个值)
- 最大行数为1000,但最佳行数介于10和100之间(取决于列数)。阅读这篇文章
- 有人能回答这个吗?stackoverflow.com/questions/51763204/…基本相同的问题,但如果存在更新
如果要插入到单个表中,可以这样编写查询(可能只在MySQL中):
1 2 3 4 5 6
| INSERT INTO table1 (FIRST, LAST)
VALUES
('Fred', 'Smith'),
('John', 'Smith'),
('Michael', 'Smith'),
('Robert', 'Smith'); |
- 从SQL Server 2008开始,如果您将双引号替换为单引号,这将起作用。
- 也适用于Postgres V9.0
- 与SQLite
- 仅限于sqlite 3.7.11之后的版本。如果不能保证,请使用下面显示的union方法:stackoverflow.com/a/5009740/841830
- 值有限制吗?比如,如果我有很多记录,那么如何处理这种情况?
- 在MS SQL数据仓库中不工作
- 它在SQL Server 2012中工作正常。
- Muneem,每个insert语句的限制值为1000行。
- @它也在SQL Server 2014上运行良好
- 这个问题怎么办?stackoverflow.com/questions/51763204/…基本相同,但在重复记录时具有更新功能
注意:此答案适用于SQL Server 2005。对于SQL Server 2008及更高版本,有许多更好的方法,如其他答案所示。
可以将"插入"与"全选联合"一起使用:
1 2 3 4 5 6 7
| INSERT INTO MyTable (FirstCol, SecondCol)
SELECT 'First' ,1
UNION ALL
SELECT 'Second' ,2
UNION ALL
SELECT 'Third' ,3
... |
但只适用于小数据集,这对于您的4条记录来说应该是很好的。
使用VALUES语法的INSERT语句可以插入多行。为此,请包含多个列值列表,每个列值都用括号括起来,并用逗号分隔。
例子:
1
| INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); |
- 一个更好的问题是,你为什么要这样做?为什么不一次性运行cleaner 4命令呢?如果一行失败,则批处理失败。如果将它们单独分组,则4个中的3个成功。
- @M-T-head我有一个例子说明我为什么要这样做,并且会给你两个理由。我正在插入一个具有数据完整性检查触发器的表。原因1-单独插入值将违反完整性检查,从而回滚事务并返回错误。我使用的是不支持延迟约束的SQL Server,因此即使它不是触发器而是常规约束,它仍然不能工作。原因2-完整性检查是一个昂贵的过程,我希望它执行一次,而不是每次事务执行1000次。我仍在寻找解决方案。
- 您可以创建一个CTE,并使用"从CTE中选择ID、名称"中的"插入到表格(ID、名称)"。
- 这个问题怎么办?stackoverflow.com/questions/51763204/…基本相同,但在重复记录时具有更新功能
- @实际上,M-T-E-HEAD的主要原因是性能。当您将数千或数百万行捆绑到合理大小的批中并使用每批一个插入操作时,插入这些行的速度会更快。