在单个SQL查询中插入多行?

1491 sql tsql sql-server insert

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

我的表有三列:Person,IdOffice.

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

BinaryMisfit.. 1992

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

  • 请注意,一个insert语句中的最大行数为1000. (324认同)
  • 这应该是措辞"一个`VALUES`子句中的最大行数是1000".这不是`INSERT`语句,限制为1000行. (160认同)
  • 我知道这个问题和答案都很陈旧,但我想提一下,使用问题中提到的方法与本答案之间存在功能差异.第一个执行触发X次,插入表中有1个记录.第二个执行触发1次,插入的表中有x个记录.假设您使用批量插入使触发器正常工作,使第二种方法成为性能的最佳选择. (25认同)
  • 这不适用于SQL Server 2005,请参阅http://stackoverflow.com/questions/2624713/how-do-i-insert-multiple-rows-without-repeating-the-insert-into-dbo-blah-part (7认同)
  • @ahnbizcad T-sql中的分号通常是可选的,但据报道它们将来是必需的.您应该养成使用它们来终止每个语句的习惯 - 您的代码看起来也会更好IMO. (4认同)

too much php.. 744

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

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

  • 从SQL Server 2008开始,如果用单引号替换双引号,这将起作用. (51认同)
  • 也适用于postgres v9.0 (11认同)
  • 并使用SQLite (9认同)
  • 只有SQLite 3.7.11以上版本.如果您无法保证,请使用此处显示的UNION方法:http://stackoverflow.com/a/5009740/841830 (6认同)
  • Muneem,每个INSERT语句的限制为1,000 VALUE行. (2认同)

DavGarcia.. 121

注意:此答案适用于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条记录应该没问题.


用户甲.. 73

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

例:

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

  • @ mt-head我有一个为什么我想要的例子,并且会给你2个理由.我插入到具有数据完整性检查触发器的表中.原因1 - 单独插入值会违反完整性检查,从而回滚事务并返回错误.我使用的SQL Server不支持延迟约束,所以即使不是触发器它也是常规约束,它仍然无法工作.原因2 - 完整性检查是一个昂贵的过程,我宁愿让它执行一次而不是每次事务1000次.我还在寻找解决方案. (6认同)
  • 一个更好的问题是你为什么要这样做?为什么不在一批中一起运行清洁4命令.如果一行失败,您的批次将失败.如果你把他们单独组合在一起3成功. (2认同)

提问时间:

查看次数:

2347683 次

最近活跃:

6 月,2 周 前