ChatGPT解决这个技术问题 Extra ChatGPT

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

这个问题在这里已经有了答案:插入多行而不重复语句的“INSERT INTO ...”部分? (16 个回答) 8 年前关闭。

我要一次插入多组数据,比如 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
对于 oracle sql,请参见 stackoverflow.com/a/93724/1452172
@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

S
Soviut

在 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/…
T-sql 中的@ahnbizcad 分号通常是可选的,但据报道将来会需要它们。你应该养成使用它们来终止每个语句的习惯——你的代码看起来也会更好。
F
Faisal

如果要插入单个表,则可以这样编写查询(可能仅在 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 行。
a
a_horse_with_no_name

注意:此答案适用于 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 有点奇怪,但在我的数据库中是特殊语法。
S
Sparkup

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

例子:

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

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