MySQL - 将表数据复制到不同的表

时间:2011-11-07 00:00:50

标签: mysql sql

假设我有两个结构相似的表,但一个是空的,另一个有几行信息:

表1

col1 | col2 | col3
red  | cow  | 1
blue | dog  | 2
gray | pig  | 3

表2

col1 | col2 | col3 | col4

表3

col1 | col2

尝试:

insert into `table2` select * from `table1`
由于列数不匹配,

将无效,并且将table3替换为table2也是如此。

更改SELECT语句的*部分不是动态用途的选项。因此,解决方法必须是组合信息的修改后的SELECT。

是否有JOIN语句或某些内容会合并表和数据的结构,所以它看起来像这样:

select * from `table1`,`table2` (JOIN or some other statement)
col1 | col2 | col3 | col4
red  | cow  | 1    | NULL
blue | dog  | 2    | NULL
gray | pig  | 3    | NULL

select * from `table1`,`table3` (JOIN or some other statement)
col1 | col2
red  | cow
blue | dog
gray | pig

基本上只是合并任何具有相同名称的列并使外部匹配无效。同样,它不能引用特定的列名来保持动态。这似乎可行,但我发现无法找到答案。

非常感谢任何可以提供帮助的人。

2 个答案:

答案 0 :(得分:1)

如果INSERT的目标表是源表的子集,就像您的示例中那样,则有一个简单的解决方案:

insert into table2(col1, col2, col3)
select *
from   table1;

或者,如果两个表的第一列的顺序与示例中的顺序相同,那么您发布的查询实际上应该有效:

insert into table2 select * from table1;

我引用了manual for version 5.6

  

如果您没有在严格的SQL模式下运行,则任何列都不是显式的   给定值设置为其默认值(显式或隐式)。对于   例如,如果指定的列列表未指定所有列表   表中的列,未命名的列设置为其默认值。   第10.1.4节“数据类型”中描述了默认值赋值   默认值”。另请参见第1.8.6.2节“无效的约束”   数据”。

然而,在INSERT操作中依赖“SELECT *”几乎总是是一个坏主意。所以,尽管你的要求,它应该是:

insert into table2(col1, col2, col3)
select col1, col2, col3
from   table1;

对于更多内容,您必须使用DESCRIBE tablex并动态构建查询。

答案 1 :(得分:0)

您可以允许最终被排除的列的空值。

insert into `table2` (col1, col2, col3) select col1, col2, col3 from `table1`

也可能对您有用。