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


84

说我有一个选择

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的位置;-)谢谢!


您要复制所选的记录吗?
ethrbunny 2011年

为什么将同一表的记录再次插入同一表?这将创建重复项
Sachin Shanbhag 2011年

抱歉,这个问题非常愚蠢,我只是遇到了一个非常简单的问题facepalm
acme

每个人都需要一个好友,一次又一次地回答他们的问题。为您的努力,我授予:[ nerdmeritbadges.com/products/rubberduck]
杰夫·弗里茨

我有同样的问题。例如,表的设计方式是,我需要复制另一个用户条目,但是有356条记录需要复制到新用户。
凯西

Answers:


160

就这么简单:

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;

1
但这不会插入domain设置为“ www.example.com”的新记录,它只是复制所有条目。
acme

您是对的-就这么简单-一个简单的问题facepalm的简单解决方案谢谢;-)
acme

我只是要写下复杂的联接来存档这个哈。非常感谢!再简单不过了。
C4d

2
您已经节省了我的编辑团队几周无意识更改模板的问题:-)
Artem Ankudovich

@ArtemAnkudovich很高兴我可以提供帮助:)
krtek

7
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;

1
无需执行此类子查询。检查其他答案
krtek 2011年

克尔泰克(Krtek):您到底建议哪个答案?我看到另外4个答案,每个答案在某种程度上都是错误的。

用哪种方式错了?至少我的第二个查询和Jeff Fritz的查询的结果与您的相同。
krtek 2011年

1
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”)仅插入一次。


4

编辑-阅读@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

@acme-如果使用insert,它肯定会复制结果,并且如果您将ID标记为主键,它甚至也不会插入行。
Sachin Shanbhag 2011年

-6

执行此SQL语句:

-- Do nothing.

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

除非您实际上只想更新“域”列中的部分或全部值。那将需要确实起作用的UPDATE语句。


3
我的回答显然很幽默,并且OP承认有脸部护理。我什至一点都不感到羞耻。
Mike Sherrill'Cat Recall'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.