MySQL:如何在 SQL 查询中为每个结果插入一条记录?

Posted

技术标签:

【中文标题】MySQL:如何在 SQL 查询中为每个结果插入一条记录?【英文标题】:MySQL: How to insert a record for each result in a SQL query? 【发布时间】:2011-07-11 23:26:51 【问题描述】:

假设我有一个选择

SELECT DISTINCT id, customer_id, domain FROM config WHERE type = 'foo';

返回一些记录。

如何在结果集中插入到达行,例如

INSERT INTO config (id, customer_id, domain) VALUES (@id, @customer_id, 'www.example.com');

@id@customer_id 是结果集中该行的字段?

编辑:我不想只是复制它,而是在domain 字段中插入一个新值。尽管如此,还是很容易面对手掌的情况 ;-) 谢谢!

【问题讨论】:

您想复制您选择的记录吗? 为什么要把同一张表的记录又插入同一张表?这将创建重复项 对不起,这个问题很愚蠢,我只是遇到了一个非常简单的问题facepalm 每个人都需要一个好友来时不时地回答他们的问题。我奖励你的努力:[nerdmeritbadges.com/products/rubberduck] 我有同样的问题。例如,表的设计方式,我需要复制另一个用户条目,但有 356 条记录我需要复制给一个新用户。 【参考方案1】:

执行这条 SQL 语句:

-- Do nothing.

您想从“config”中选择不同的行,并将这些相同的行插入到同一个表中。他们已经在里面了。无事可做。

除非您实际上只是想更新“域”列中的部分或全部值。这需要一个真正起作用的 UPDATE 语句。

【讨论】:

我的回答显然很幽默,并且 OP 承认要捂脸。我一点也不为此感到羞耻。【参考方案2】:
INSERT INTO config (id, customer_id, domain)
SELECT id, customer_id, 'www.example.com' FROM (
  SELECT DISTINCT id, customer_id, domain FROM config
  WHERE type = 'foo'
) x;

【讨论】:

没有必要做这样的子查询。检查其他答案 Krtek:你建议哪个答案?我看到其他 4 个答案,每个答案都在某种程度上是错误的。 哪里错了?至少我的第二个查询和 Jeff Fritz 的查询与您的结果相同。 Krtek:如果表有记录(1,1,"a","foo")和(1,1,"b","foo"),那么问题中的第一个查询返回 (1,1,"a"), (1,1,"b"),因此应将记录 (1,1,"example.com") 插入两次。您的答案与字符串文字“example.com”不同,因此 (1,1,"example.com") 仅插入一次。【参考方案3】:

编辑-阅读对@Krtek 回答的评论后。

我猜你是要求更新而不是插入 -

update config set domain = 'www.example.com'

这将更新配置表中域为“www.example.com”的所有现有记录,而不会创建任何重复条目。

旧答案 -

你可以使用类似 -

INSERT INTO config (id, customer_id, domain)
select id, customer_id, domain FROM config

注意:- 如果您将 id 作为主键,这将不起作用

【讨论】:

谢谢,但我不想复制每个字段,“域”字段应该不同。但这很简单,我只是被这个愚蠢的问题困住了。 @acme - 如果你使用插入,它肯定会重复结果,如果你将你的 id 标记为主键,它甚至不会让你插入行。【参考方案4】:
INSERT INTO Config (id, customer_id, domain)
SELECT DISTINCT id, customer_id, 'www.example.com' FROM config

此语法的 mysql 文档在这里:

http://dev.mysql.com/doc/refman/5.1/en/insert-select.html

【讨论】:

谢谢,但我不想复制每个字段,“域”字段应该不同。但这很简单,我只是被这个愚蠢的问题困住了。【参考方案5】:

就这么简单:

INSERT INTO config (id, customer_id, domain) 
SELECT DISTINCT id, customer_id, domain FROM config;

如果你想要“www.example.com”作为域,你可以这样做:

INSERT INTO config (id, customer_id, domain) 
SELECT DISTINCT id, customer_id, 'www.example.com' FROM config;

【讨论】:

但这不会插入新记录,domain 设置为 'www.example.com',它只是复制所有条目。 你说得对 - 就这么简单 - 一个简单问题的简单解决方案 facepalm 谢谢 ;-) 我只是想写下复杂的连接来存档这个哈哈。非常感谢!再简单不过了。 您为我的编辑团队节省了几周无意识的模板更改 :-) @ArtemAnkudovich 很高兴我能帮上忙 :)

以上是关于MySQL:如何在 SQL 查询中为每个结果插入一条记录?的主要内容,如果未能解决你的问题,请参考以下文章

在mysql中为某一行的某几列插入数据怎么写

如何在 MySQL 中为每个用户选择最多 3 个项目?

mysql 如何把查询到的结果插入到另一个表中

如何在 MySQL 中为每个 ID 只选择一行?

将一个表的查询结果插入到另一个表中(oracle、mysql、sql 、GP)

如何在 MySQL 中为每个类别创建一个 SQL 窗口函数列?