MYSQL把字段少的表用PHP复制到字段多的表

在系统升级过程中,需要将旧版数据库中字段较少的表数据复制到新版数据库字段较多的表中。通过SQL语句实现复制,但由于无法直接获取并动态设置字段名,故借助PHP来完成。利用PHP执行SQL获取旧表字段,然后构建插入新表的语句,解决了字段动态设置的问题。尽管此方法存在局限,如需手动输入旧表名和处理字段数量不匹配的情况,但可以通过循环和自动化处理进一步优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公司系统升级,原来那套系统的数据库是旧版的,字段比新版的少很多,现在提出要求,把字段少的那个表的数据,复制到新表中。

思路:使用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.旧表字段比新表多的话,需要去新表添加,解决方式是获取到旧表的字段名和字段规则,然后新表中没有该字段就自动创建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值