Mysql 使用公共列复制表数据

Mysql 使用公共列复制表数据,mysql,sql,Mysql,Sql,我需要将数据从一个表复制到另一个表。这些表没有所有相同的列或顺序;但是要复制的数据总是在相同的列中;也就是说,来自列foo的数据应复制到列foo 如果只有两个表,我可以硬编码列名,如下所示: INSERT INTO table_target ( column1, column2, column4 ) SELECT column1, column2, column4 FROM table_source; 但是,有几十个表,需要进行一些额外的转换,所以如果我可以说:复制任何匹配的列,忽略其余

我需要将数据从一个表复制到另一个表。这些表没有所有相同的列或顺序;但是要复制的数据总是在相同的列中;也就是说,来自列
foo
的数据应复制到列
foo

如果只有两个表,我可以硬编码列名,如下所示:

INSERT INTO table_target ( column1, column2, column4 ) 
  SELECT column1, column2, column4 FROM table_source;
但是,有几十个表,需要进行一些额外的转换,所以如果我可以说:复制任何匹配的列,忽略其余的列,那就太好了

我已经设法弄清楚了如何获得一个常见列的列表,但现在我被卡住了

SELECT src.col
  FROM (SELECT COLUMN_NAME as col
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_name = 'table_target') as trg
INNER JOIN 
  (SELECT COLUMN_NAME as col
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_name = 'table_source') as src ON (src.col=trg.col)
; 

我在过去使用过一个技巧,效果很好,就是编写一个返回SQL的查询,然后将它复制粘贴到db命令shell中。在这种情况下,这将是您的查询:

SELECT CONCAT(
    'INSERT INTO table_target (',  
    GROUP_CONCAT(trg.col), -- produces output like "col1, col2, col3"
    ') SELECT ',
    GROUP_CONCAT(trg.col), -- produces output like "col1, col2, col3"
    ' FROM table_source;') as sql_stmt
FROM (
(SELECT COLUMN_NAME as col
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'table_target') as trg
INNER JOIN 
(SELECT COLUMN_NAME as col
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'table_source') as src ON src.col=trg.col) x;
这利用了mysql方便的函数,该函数将值聚合为一个-perfect,用于创建用于生成SQL的列名列表


我还将您的查询包装在别名中,以便我们可以从中进行选择。

您可以使用动态sql吗?您是否在另一种编程语言中使用SQL?这听起来像是一次性任务。这是真的吗?或者它是一种必须反复运行的东西,也许是在生产中?如果是一次性的,您可以使用上面的代码(进行一些更改)生成更多的SQL,然后运行生成的SQL。是的,这是一个一次性查询,我最终使用的解决方案基本上就是这个两步过程。不过,知道如何“正确”地执行查询还是不错的。然后,查询可以根据需要立即执行。非常感谢。不过,我还是对任何类似于eval的东西保持警惕。