假设我有两个结构相似的表,但一个是空的,另一个有几行信息:
表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
基本上只是合并任何具有相同名称的列并使外部匹配无效。同样,它不能引用特定的列名来保持动态。这似乎可行,但我发现无法找到答案。
非常感谢任何可以提供帮助的人。
答案 0 :(得分:1)
如果INSERT
的目标表是源表的子集,就像您的示例中那样,则有一个简单的解决方案:
insert into table2(col1, col2, col3)
select *
from table1;
或者,如果两个表的第一列的顺序与示例中的顺序相同,那么您发布的查询实际上应该有效:
insert into table2 select * from table1;
如果您没有在严格的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`
也可能对您有用。