Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-将表数据复制到不相同的表_Mysql_Sql - Fatal编程技术网

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

MySQL-将表数据复制到不相同的表,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语句的*部分不是一个选项

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

表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语句的*部分不是一个选项。因此,解决方法必须是结合信息的修改选择

是否有一个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为空
但我绝对同意您关于始终使用什么的评论。描述是我最后的选择,但这些答案让我觉得这似乎是我唯一的选择。谢谢你的提问,但我认为我要求的语法比那些更复杂。