公司系统升级,原来那套系统的数据库是旧版的,字段比新版的少很多,现在提出要求,把字段少的那个表的数据,复制到新表中。
思路:使用SQL语句,注意,前面这个表名后面加括号,后面select后面不加括号
INSERT INTO 新表 ( name , price ) SELECT name , price FROM 旧表这个语句有个缺点就是表名后面的字段名,例如name,price这些我们不好获取,一个表还好说,多个表的话每个表去写那些字段也够烦的,但是,sql语句可以获取一个表全部字段,并把字段组合成带逗号的语句,刚好符合我们的要求。
select GROUP_CONCAT(COLUMN_NAME) from information_schema.COLUMNS where table_name = '旧表名' and table_schema = '库名';这样我们就想,如果能把获取到的字段名字符串,放到表名后面,不就行了吗?
但可惜的是,MYSQL并不支持这样,直接把搜索结果放到表名后面会报错。
于是,我们借用PHP,其中DB那个是我用的框架带的MYSQL查询功能,其实只要其中的SQL语句即可:
public function testInsert(){ $old_table = '旧前缀_旧表名'; $str_col = DB::select("select GROUP_CONCAT(COLUMN_NAME) as result from information_schema.COLUMNS where table_name = '$old_table' and table_schema = 'lesson'"); $result = $str_col[0]->result; //该结果是以字段为结果的字符串,如"name,price" $new_table = str_replace('旧前缀', '新前缀', $old_table); //新表名称,和旧表一样,但前缀不同 $insert = DB::select("INSERT INTO $new_table ($result) SELECT $result FROM $old_table"); }我的这个方法还有两个缺点:
1.表特别多的话,每次都要输入一次旧表名,解决方式可以做一个循环
2.旧表字段比新表多的话,需要去新表添加,解决方式是获取到旧表的字段名和字段规则,然后新表中没有该字段就自动创建