在MySQL中将数据从一个表插入到另一个表

83

我希望能从一张表中读取全部数据,并将一些数据插入到另一张表中。我的查询语句如下:

  INSERT INTO mt_magazine_subscription ( 
      magazine_subscription_id, 
      subscription_name, 
      magazine_id, 
      status ) 
  VALUES ( 
      (SELECT magazine_subscription_id, 
              subscription_name, 
              magazine_id 
       FROM tbl_magazine_subscription 
       ORDER BY magazine_subscription_id ASC), '1')

但是我遇到了一个错误,它的提示信息是:
  #1136 - Column count doesn't match value count at row 1

请帮我。

12个回答

150
你可以使用INSERT...SELECT语法。请注意,你可以在SELECT部分直接引用'1'。
INSERT INTO mt_magazine_subscription ( 
      magazine_subscription_id, 
      subscription_name, 
      magazine_id, 
      status ) 
SELECT magazine_subscription_id, 
       subscription_name, 
       magazine_id, 
       '1'
FROM tbl_magazine_subscription
ORDER BY magazine_subscription_id ASC 

这很有帮助,我发现它比其他工具添加3万多行数据要快得多。谢谢。 - Jarnail S
如果我想在插入新数据之前编辑数据怎么办? - John Demetriou
@JohnDemetriou 你可以通过对语句中 SELECT 部分的值进行操作来转换数据。例如,subscription_name + '_old'。如果你有更复杂的想法,为什么不提一个新的 SO 问题呢? - Gustav Bertram

33

如果您想将一个表中的所有数据插入到另一个表中,有一个非常简单的SQL语句

INSERT INTO destinationTable  (SELECT * FROM sourceDbName.SourceTableName);

5
我认为这是最好的答案。 - BARIS KURT
太棒了。但我有一个问题:为什么要这样做?select返回给insert into什么? - Marcelo
@Gustav Bertram 您从源表中选择的列数与目标表中的列数不同。在 SQL 的插入部分中,您正在使用四个列,在选择部分中仅选择了三个列。 - Ravi
1
当您想要插入特定列的值时,这并不是有帮助的。 - Kiran Joshi
在这种情况下,请在您的选择查询中提及列名。 - Ravi

5

这样是行不通的。

当您尝试使用查询插入行时,查询中应该包含所有值。

针对上述问题,如果您想要插入 杂志订阅ID、订阅名称、杂志ID、状态 但在选择查询中只有 杂志订阅ID、订阅名称、杂志ID、状态 ,那是不可能的。

如果您想要插入,您需要使用查询或直接插入值。


5
实际上,将数据从一个表复制到另一个表的MySQL查询语句是:

INSERT INTO 目标表 SELECT * FROM 源表;

Insert into table2_name (column_names) select column_name from table1

将来自table1的值复制到table2中


5

如果有一个像"id"这样的主键,你需要将其排除在外,例如我的php表格有:id、col2、col3、col4列。id是主键,所以如果我运行这段代码:

INSERT INTO php  (SELECT * FROM php2);

我可能会遇到这个错误:
#1062 - 主键 ‘PRIMARY’ 的重复条目 ‘1’
所以这里有一个解决方案,我排除了“id”键:
INSERT INTO php ( col2,col3,col4)  (SELECT col2,col3,col4 FROM php2);

所以我新的php表中没有php2表的所有行了。

2
INSERT INTO mt_magazine_subscription ( 
      magazine_subscription_id, 
      subscription_name, 
      magazine_id, 
      status ) 
VALUES ( 
      (SELECT magazine_subscription_id, 
              subscription_name, 
              magazine_id,'1' as status
       FROM tbl_magazine_subscription 
       ORDER BY magazine_subscription_id ASC));

1

在MySQL中,可以使用条件将一个表中的数据插入到另一个表中,而且同样适用于SQL Server。只有不存在的数据才会被更新。由于两个表具有相同的结构,因此不需要传递列。

insert into table_A
select * from table_A_copy 
where not exists
(
select * from table_A where table_A_copy.clm_a=table_A.clm_a and table_A_copy.clm_b=table_A.clm_b and table_A_copy.clm_c=table_A.clm_c
);

0

尝试使用这个

INSERT INTO mt_magazine_subscription ( 
      magazine_subscription_id, 
      subscription_name, 
      magazine_id, 
      status ) 
SELECT magazine_subscription_id, 
       subscription_name, 
       magazine_id, 
       '1'
FROM tbl_magazine_subscription
ORDER BY magazine_subscription_id ;

在 select 子句中使用硬编码的值


请添加更多细节以扩展您的答案,例如可工作的代码或文档引用。 - Community

0

试试这个。你的做法不对。

    INSERT INTO mt_magazine_subscription( 
    magazine_subscription_id, 
    subscription_name, 
    magazine_id, status) VALUES ( 
         (SELECT magazine_subscription_id, subscription_name, 
                 magazine_id,1 as status FROM tbl_magazine_subscription 
                 ORDER BY magazine_subscription_id ASC)
    )

这不起作用,因为选择周围的额外父项不起作用。请参阅文档:http://dev.mysql.com/doc/refman/5.0/en/insert-select.html它是INSERT INTO db (columns) SELECT columns FROM table WHERE blah = 1; - transformerTroy

0
  INSERT INTO mt_magazine_subscription ( 
      magazine_subscription_id, 
      subscription_name, 
      magazine_id, 
      status ) 
  VALUES ( 
      (SELECT magazine_subscription_id, 
              subscription_name, 
              magazine_id,'1' as status
       FROM tbl_magazine_subscription 
       ORDER BY magazine_subscription_id ASC))

这不起作用,因为选择周围的额外父元素不起作用。请参阅文档:http://dev.mysql.com/doc/refman/5.0/en/insert-select.html它是 INSERT INTO db (columns) SELECT columns FROM table WHERE blah = 1; - transformerTroy

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