MySQL脚本 批量修改

✨需求:

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;

不错,解决的实际的问题,不用每个表去执行了。

在这里插入图片描述
(偷图,侵删 -,-)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值