MySQL数据导入动态SQL和PROCEDURE 结合

本文介绍了一种通过创建临时表并使用存储过程进行自动化数据迁移的方法,以解决数据库重构过程中涉及大量表更新的问题。

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

项目的数据库重构,不可避免的要进行数据的导入导出,于是利用查询生成临时表就起了大的作用
1.要将与公司表相关联的表存成ID,之前表里面存的是公司名称,大量的汉字不利于检索。
首先做好原数据库的备份,备份很重要,备份很重要
1. 生成临时表
2.在临时表里面做更新
3.截断原来的表修改字段名
4.将修改后的数据导入新表

create table test SELECT * from 要更新的表名;
UPDATE test a
LEFT JOIN e_company b ON b.`name` = a.company_name
SET a.company_name = b.id
insert into  要更新的表名 SELECT * from test

如果你有很多张表表的话这样就比较麻烦 ,可以考虑把表名当做变量来写成一个动态SQL结合存储过程 这样只需要传参数就可以了

需要注意的是,动态SQL每次只能执行一个SQL语句,所以你要将SQL分开来进行concat处理,在执行 否则就会报错。
下面以yy表为列

create PROCEDURE tests(tableName varchar(20)) 
BEGIN 
  set @tableNames = CONCAT(tableName); 
  set @sqlStr = CONCAT('drop table if EXISTS test;');
  prepare stmt from @sqlStr; 
  execute stmt ;
  deallocate prepare stmt;
  set @sqlStr = CONCAT('create table test select * from ',@tableNames,';');
  prepare stmt from @sqlStr; 
  execute stmt ;
  deallocate prepare stmt;
  set @sqlStr = CONCAT('update test a LEFT JOIN e_company b ON b.`name`= a.company_name SET a.company_name = b.id;');
  prepare stmt from @sqlStr; 
  execute stmt ;
  deallocate prepare stmt;
  set @sqlStr = CONCAT('truncate table ',@tableNames,';');
  prepare stmt from @sqlStr; 
  execute stmt ;
  deallocate prepare stmt;
  set @sqlStr = CONCAT('insert into ',@tableNames,' select * from test');
  prepare stmt from @sqlStr; 
  execute stmt ;
  deallocate prepare stmt;
END; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值