【问题标题】:Inserting multiple rows in a single SQL query? [duplicate]在单个 SQL 查询中插入多行? [复制]
【发布时间】:2010-10-01 22:59:49
【问题描述】:

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

【问题讨论】:

  • 版主注意:请把关于这个问题的优点的所有讨论发送到this meta post
  • @Chinggis6 是的,很简单,只需对列值使用选择:
  • @Chinggis6 insert into profiles (name, description) select first, 'Auto-generated' from users 您似乎混淆了插入和更新语句,它们是不同的野兽。
  • @Chinggis6 啊,我明白了。好吧,我只是建议使用标准的insert ... select 语法,它会为您提供所需的一切,并且尽可能灵活。 dev.mysql.com/doc/refman/5.5/en/insert.html

标签: sql sql-server tsql insert


【解决方案1】:

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

【讨论】:

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

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

你可以使用INSERT with 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()) + ' after date.' 我知道 date2str 有点奇怪,但在我的数据库中是特殊语法。
【解决方案3】:

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

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
  • Muneem,每个 INSERT 语句的限制是 1,000 VALUE 行。
【解决方案4】:

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

示例:

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

【讨论】:

  • 一个更好的问题是您为什么要这样做?为什么不只在一批中一起运行更清洁的 4 个命令。如果一行失败,您的批次将失败。如果您将它们单独分组在一起,则 3 of 4 成功。
  • @m-t-head 我有一个我为什么想要的例子,并且会给你两个理由。我正在插入具有数据完整性检查触发器的表中。原因 1 - 单独插入值会违反完整性检查,从而回滚事务并返回错误。我正在使用不支持延迟约束的 SQL Server,因此即使它不是触发器而是常规约束,它仍然无法工作。原因 2 - 完整性检查是一个昂贵的过程,我宁愿让它执行一次,而不是每次事务执行 1000 次。我仍在寻找解决方案。
  • 您可以创建一个 CTE 并使用 insert into YourTable (ID,Name) From select ID,Name From CTE
  • 这个问题怎么样? stackoverflow.com/questions/51763204/… 基本相同,但有重复记录更新功能
  • @m-t-e-head 实际上,主要原因是性能。当您将它们捆绑成合理大小的批次并在每个批次中使用一个 INSERT 时,插入数千或数百万行会快得多。
猜你喜欢
  • 2017-07-13
  • 1970-01-01
  • 2019-10-04
  • 2011-03-17
  • 2013-02-28
  • 1970-01-01
  • 2010-11-13
相关资源
最近更新 更多