一、背景
在项目中我们的业务使用了分表的策略,因此mysql库中会有很多表名相似只是序号不同的表(如:dingning_program_00、dingning_program_01、…、dingning_program_63)。
在开发过程中会有给数据库中的表添加字段的需求,这样我们就需要写ddl语句在这64张表中添加字段。
但是这样就一个问题就是所有表中的字段是否都添加成功,自己一个个验证有些麻烦,所以写了这个mysql函数进行验证。
二、实现
//该test()如果存在就删除他
Drop function if exists test;
//创建函数,并确定返回值类型
create function test() returns VARCHAR(1024)
BEGIN
//定义一些局部变量
declare i int default 0;
declare st1 varchar(1024) default '';
declare st2 varchar(1024) default '';
declare st3 varchar(1024) default '';
declare st4 varchar(1024) default '';
//循环开始
while i <= 63 do
//前10张表的序号都是以0开头,单独拼接
if i <= 9 THEN
//表名进行拼接
set st1 = CONCAT("dingning_program_","0",i);
//查找表中是否有这个字段并返回表名,同时赋值给st3变量
//注:如果返回的值为空,即表中没有这个字段,则不给st3赋值
SELECT TABLE_NAME into st3 FROM information_schema.columns WHERE table_name =st1 AND column_name = 'launcher_sky_backgroup_url';
//如果st3没有改变,即表中没有这个字段,就把表的序号进行拼接
if st3 = '' then
set st4 = CONCAT(st4,"+",i);
end if;
//后面的表按照i值单独拼接
ELSE
//表名进行拼接
set st2 = CONCAT("dingning_program_",i);
//查找表中是否有这个字段并返回表名,同时赋值给st3变量
//注:如果返回的值为空,即表中没有这个字段,则不给st3赋值
SELECT TABLE_NAME into st3 FROM information_schema.columns WHERE table_name =st2 AND column_name = 'launcher_sky_backgroup_url';
//如果st3没有改变,即表中没有这个字段,就把表的序号进行拼接
if st3 = '' then
set st4 = CONCAT(st4,"+",i);
end if;
end if;
set st3 = '';
set i = i + 1;
end while;
//把表中没有“launcher_sky_backgroup_url”该字段的表名的序号进行返回
return st4;
END;
//调用函数
select test();
//该test()如果存在就删除他
Drop function if exists test;
三、最后
- 上面的代码复制到mysql运行时需要把上面的注释去掉,mysql的注释语法不是//
- 此代码写的比较简陋,还有很大的优化空间或者还有更好的方法去实现,希望同行指正。