MySQL-将表数据复制到不相同的表
假设我有两个结构相似的表,但一个是空的,另一个有几行信息: 表1MySQL-将表数据复制到不相同的表,mysql,sql,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` 由于列计数不匹配,将无法工作,用表3替换表2也是如此 出于动态目的,更改SELECT语句的*部分不是一个选项
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`
由于列计数不匹配,将无法工作,用表3替换表2也是如此
出于动态目的,更改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
基本上,只需合并任何具有相同名称的列,并将外部匹配项置零即可。同样,它不能引用特定的列名来保持动态。这似乎可行,但我发现不可能找到答案
非常感谢所有能够提供帮助的人。如果插入的目标表是源表的一个子集,如您的示例所示,那么有一个简单的解决方案:
insert into table2(col1, col2, col3)
select *
from table1;
或者,如果两个表的前几列的顺序与示例中相同,那么您发布的查询实际上应该可以工作:
insert into table2 select * from table1;
我引述以下的意见:
如果不是在严格SQL模式下运行,则任何列都不会显式
给定值设置为其默认值(显式或隐式)。对于
例如,如果指定的列列表未命名所有
在表中,未命名的列被设置为其默认值。
第10.1.4节“数据类型”中描述了默认值分配
默认值”。另请参见第1.8.6.2节“对无效
数据”
然而,在插入操作中依赖“SELECT*”几乎总是一个坏主意。因此,尽管你提出了要求,但它确实应该是:
insert into table2(col1, col2, col3)
select col1, col2, col3
from table1;
对于更多内容,您必须使用descripe tablex
并动态构建查询。您可以允许将最终被排除的列使用空值
insert into `table2` (col1, col2, col3) select col1, col2, col3 from `table1`
也可能对您有用。他也可以使用:插入到表2中选择表1.*,表1为空
但我绝对同意您关于始终使用什么的评论。描述是我最后的选择,但这些答案让我觉得这似乎是我唯一的选择。谢谢你的提问,但我认为我要求的语法比那些更复杂。