✨需求:
tstd_jour流水表分表
比如 tstd_jour_1 tstd_jour_2 ... 这样的
因为历史遗留问题,之前的表都没有主键id,而是使用的code(字符串code作为主键)
🎑目标:
全部增加id主键
🎨实现:
1🧶、单个表的sql变更sql是
ALTER TABLE tstd_jour_1 DROP PRIMARY KEY, ADD `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键' first, ADD PRIMARY KEY (`id`);
更新表 tstd_jour_1 删除旧主键、增加id字段、增加id主键(因为原本的code是主键,一个表只能存在一个主键索引)
2🧶、mysql的循环写法
参考资料 mysql 三种循环
简单来说,就是mysql 可以用三种关键字实现循环
while (翻译:直到…时候)、 loop (翻译:圆圈,环)、repeat(翻译:重复)
没有for(可能有点不习惯,当然实际上的效果可以使用其他的方法替换达到同样的效果)
while的参考写法:(简单写个while 如果觉得需要讲一下其他的,欢迎留言讨论🧨)
代码:
/* while循环语法:
while 条件 DO
循环体;
end while;
*/
create procedure sum1(a int)
begin
declare sum int default 0; -- default 是指定该变量的默认值
declare i int default 1;
while i<=a DO -- 循环开始
set sum=sum+i;
set i=i+1;
end while; -- 循环结束
select sum; -- 输出结果
end;
-- 执行存储过程
call sum1(100);
-- 删除存储过程
drop procedure if exists sum1;
代码解释:
procedure
(翻译:程序,步骤 ; 通俗解释:定义方法的标准格式 )
sum1
通俗解释:方法名
a int
通俗解释:参数是a 类型是int(顺序和java不一样,是变量在前)
declare
声明、宣称 (通俗解释:固定格式)
declare sum int default 0;
定义变量 sum 类型是int 默认值是0 (相当于java int sum = 0;)
while i<=a DO
直到 i小于a,否则一直执行 。 通俗解释:固定格式
set sum=sum+i;
就是变量赋值 sum = sum +1; 通俗解释:固定格式
3🧶、构建我们的存储过程
直接复制替换中间部分即可,当然方法名字你也可以换一下。比如我这里换成 addIdKey
create procedure addIdKey(max int)
begin
declare i int default 0;
while i < max DO -- 循环开始
ALTER TABLE tstd_jour_i DROP PRIMARY KEY, ADD `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键' first, ADD PRIMARY KEY (`id`);
set i=i+1;
end while; -- 循环结束
select max; -- 输出结果
end;
-- 执行存储过程
call addIdKey(1024);
-- 删除存储过程
drop procedure if exists addIdKey;
实际上上面的脚本无法执行,因为需要拼接sql,但是里面涉及到了表名的拼接,直接拼接mysql无法识别你是 tstd_jour_i
还是tstd_jour_
+ i
4🧶、最终脚本
主要利用预执行(PREPARE stmt FROM @a;
)
将拼接好的字符串转化为可执行的sql语句,然后调用执行sql(EXECUTE stmt;
),
那么编译器就明确直接正常执行sql就好了
DROP PROCEDURE
IF
EXISTS addIdKey;
CREATE PROCEDURE addIdKey ( max int ) BEGIN
DECLARE
i INT DEFAULT 0;
WHILE
i < max DO-- 循环开始
SET @a = concat( "ALTER TABLE tstd_jour_", i, " DROP PRIMARY KEY, ADD `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键' first, ADD PRIMARY KEY (`id`);" );
PREPARE stmt FROM @a;
-- select @a;
EXECUTE stmt;
SET i = i + 1;
END WHILE;-- 循环结束
END;
CALL addIdKey ( 1024 ); -- 执行存储过程
DROP PROCEDURE -- 删除存储过程
IF
EXISTS addIdKey;
不错,解决的实际的问题,不用每个表去执行了。
(偷图,侵删 -,-)