首页 > 学院 > 开发设计 > 正文

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

2019-11-08 20:45:43
字体:
来源:转载
供稿:网友

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

create table test SELECT * from 要更新的表名;UPDATE test aLEFT JOIN e_company b ON b.`name` = a.company_nameSET a.company_name = b.idinsert 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;
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表