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


71

我想从一个表中读取所有数据,然后将一些数据插入到另一个表中。我的查询是

  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

请帮我。

Answers:


132

您可以使用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 

它很有帮助,我发现添加30k +行比较起来非常快。谢谢。
Jai

如果要在插入新数据之前编辑数据怎么办?
John Demetriou

@JohnDemetriou您可以通过SELECT对语句部分中的值进行处理来转换数据。例如,subscription_name + '_old'。如果您有更复杂的想法,为什么不问一个新的SO问题?
古斯塔夫·贝特拉姆

24

如果要将所有数据从一个表插入到另一个表,则有一个非常简单的sql

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

5
我认为这是最好的答案
BARIS KURT'Dec 25'16

惊人。但是我有一个问题:为什么要这样做?这select返回到 insert into什么?
Alex

@Gustav Bertram从源表中选择的列数与目标表中的列数不相同。在SQL的插入部分中,您使用四列,在选择部分中,您仅选择三列。
拉维

当您要插入特定的列值时,它没有帮助
Kiran Joshi

在这种情况下,@ KiranJoshi会在您的选择查询中提及列名称。
拉维

5

它不会像这样工作。

当您尝试使用查询插入行时,所有值都应存在于查询中。

对于上述问题,您想magazine_subscription_id, subscription_name, magazine_id, status 在选择查询中 插入 magazine_subscription_id, subscription_name, magazine_id, status1,这是不可能的。

如果要插入,则需要使用直接值查询进行插入


4

如果有像“ id”这样的主键,则必须将其排除在外,例如我的php表具有:id,col2,col3,col4列。id是主键,所以如果我运行以下代码:

INSERT INTO php  (SELECT * FROM php);

我可能会收到此错误:

#1062 - Duplicate entry '1' for key 'PRIMARY'

所以这是解决方案,我排除了“ id”键:

INSERT INTO php ( col2,col3,col4)  (SELECT col2,col3,col4 FROM php2);

因此,我的新php表不再具有所有php2表行。


3

实际上,从表到另一表的复制数据的mysql查询是

Insert into table2_name (column_names) select column_name from table1

其中,值从table1复制到table2


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

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

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

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

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

-1
INSERT INTO destination_table ( 
      Field_1, 
      Field_2, 
      Field_3) 
SELECT Field_1, 
      Field_2, 
      Field_3 
      FROM source_table;

但是这是一个糟糕的MySQL

改为这样做:

  1. drop the destination table: DROP DESTINATION_TABLE;
  2. CREATE TABLE DESTINATION_TABLE AS (SELECT * FROM SOURCE_TABLE);

3
BAD MYSQL是什么意思?如果我们在DESTINATION_TABLE中已经有一些数据该怎么办?
Adarsh Rajput

2
这不能回答有关在两个表中具有不同列数的INSERT / SELECT的问题……
Marki555

1
原始问题中的人可能在目的地表中有数据。由于这种可能性,删除表听起来并不是万能的好选择。
chrisfs 2015年

-2
INSERT INTO mt_magazine_subscription SELECT *
       FROM tbl_magazine_subscription 
       ORDER BY magazine_subscription_id ASC
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.