项目的数据库重构,不可避免的要进行数据的导入导出,于是利用查询生成临时表就起了大的作用
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;