mysql 大表改名 不崩溃 mysql修改表名 耗时吗_sql

存储过程,在上一家公司的时候写过。觉得把语句进行封装之后直接调用一个变量就好,不用看一堆乱七八糟的语句,还可以自动化导出查询到的结果。当前试验的存储过程,是想把每个月例行跑的数据丢到里面去执行,不用自己一个一个去等着跑,试来试去好像没啥问题,就是其中有些表名每个月是动态更新的,我想把这个也弄成变量拼接成表名去处理。


mysql 大表改名 不崩溃 mysql修改表名 耗时吗_百度_02

这个问题百度了几天无果之后,今天我去问之前的DBA了,他最开始给了我一个解决办法,后面我在跑的时候报错了。


SET v_month= DATE_FORMAT(now(), '%Y%m') ;

SET v_table_name = concat('merchant_',v_month);

在执行的时候提示变量没定义,后面我手动改了一下:

SET @v_month= DATE_FORMAT(now(), '%Y%m')-1;
SET @v_table_name = concat('merchant_',@v_month);
PREPARE stm1 from 'SELECT * from ?';
EXECUTE stm1 using @v_table_name;

mysql 大表改名 不崩溃 mysql修改表名 耗时吗_mysql 存储过程 动态表名 时间_03

【这个prepare也是这次百度到的用法,好像说是预处理吧,这种处理措施据说是可以提高语句的运行效率,百度到另一个比较好玩的,就是解方程吧类似:


PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
SET @a = 3;
SET @b = 4;
EXECUTE stmt1 USING @a, @b;】

mysql 大表改名 不崩溃 mysql修改表名 耗时吗_存储过程_04

后面继续找大神解决这个问题,后面大神给我一个解决方法及示例:

create table merchant_202007(id int);SET @v_month= DATE_FORMAT(now(), '%Y%m') ;SET @v_table_name = concat('merchant_',@v_month);
select   @v_table_name ;
set  @sql_1 = concat('select * from  ',@v_table_name );
select  @sql_1 ;
PREPARE aa FROM @sql_1;
EXECUTE aa;
deallocate prepare aa;

这个问题算是告一段落了,为啥要这么写,我还不太清楚,这个后面再慢慢研究吧……

mysql 大表改名 不崩溃 mysql修改表名 耗时吗_sql_05


另一个问题是转义字符的问题。因为我拼接的语句中,有一部分是本身就带有单引号的,可是用concat函数进行拼接的时候,文本的每一部分都要用单引号括起来。所以这个存储过程在保存的时候报错了。我去群里问了另一个人,那个人百度了一段话给我,我明白了大概是转义字符导致的,所以将原本的单引号用双引号括起来之后这个问题就解决了。

mysql 大表改名 不崩溃 mysql修改表名 耗时吗_mysql 大表改名 不崩溃_06