在MySQL中使用循环从另一张表插入数据。

9
我可以使用php或其他语言来解决问题,但我很想学习更多的SQL。
有没有一种方法可以解决这个问题:
我有两个表(结构无法更改),一个是带有一些数据的content表,另一个是带有一些附加信息的content_info表。它们之间的关系是:content.id = content_info.content_id
我的需求是:如果content_info中没有数据集但在content表中存在,则我想将其复制到content_info表中,以便两个表中最终的数据集数量相同。我尝试了以下方式,但不幸的是它并没有起作用:
...
BEGIN
  (SELECT id, ordering FROM content;)
  cont:LOOP
    @cid = SELECT content_id FROM content_info WHERE content_id = (id)
    IF @cid != (id) THEN
      INSERT INTO content_info SET content_id = (id), ordering = (ordering)
      ITERATE cont;
    END IF;
  END LOOP cont;
END
..

有人有想法吗,或者最终不可能实现?先谢谢!
3个回答

13

你可以使用INSERT IGNORE来插入新行,但如果表中已经存在会导致重复条目错误的行,则不做任何操作。

INSERT IGNORE INTO jos_content_frontpage (content_id, ordering)
SELECT id, ordering FROM jos_content

3

看起来您正在寻找INSERT ... SELECT语法。只要将数据格式化以匹配目标表,任何选择都可以插入到表中。

另外,您的INSERT语法不正确,似乎在使用UPDATE语法。

INSERT INTO table (field1, field2, field3) VALUES ('1','2','3');

INSERT INTO table (field1, field2, field3) SELECT field1, field2, field3 FROM ...

它接近了,但实际上对我不起作用,因为表中已经存在数据,我既不想覆盖它,也不想删除它。如果在不进行删除的情况下尝试此操作会导致错误:#1062 - 重复条目“5”以键“PRIMARY”存在。但这绝对是一个好提示:1个赞! - Andreas
就其价值而言,“INSERT... SET field=value”语法是有效的标准SQL。当需要设置大量列并且在维护两个列表(一个用于列,一个用于VALUES)时很容易将它们放错顺序时,我喜欢使用它。但是,这种语法形式不支持多行“INSERT”或“INSERT... SELECT”。 - Bill Karwin
你可以使用INSERT IGNORE来抑制错误,或者在插入数据时使用JOIN语句过滤掉已经存在的数据。SET语法不能与INSERT...SELECT一起使用。 - Brent Baisley

2

我将以id字段为例进行说明,您也可以添加其他字段:

insert into content_info(content_id)
select content.id
from content left outer join content_info
on (content.id=content_info.content_id)
where content_info.content_id is null

另一种方法
insert into content_info(content_id)
select content.id
from content 
where not exists (
     select *
     from content_info
     where content_info.content_id  = content.id 
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接