mysql 按月建表_MySQL之存储过程按月创建表
具体不多说,直接上代码。欢迎一起交流和学习。
创建一个按月创建表的存储过程,SQL语句如下:
DELIMITER //
DROP PROCEDURE IF EXISTS create_table_by_month //
CREATE PROCEDURE `create_table_by_month`()
BEGIN
#--提前申明变量,后面会用到
DECLARE nextMonth varchar(20);
DECLARE nextTABLE varchar(20);
DECLARE csql varchar(5210);
DECLARE outputParam int;
DECLARE tableName_1 varchar(20);
DECLARE tableName_2 varchar(20);
DECLARE table_prefix varchar(20);
#--获取下个月
SELECT SUBSTR(replace(DATE_ADD(CURDATE(), INTERVAL 1 MONTH), '-', ''), 1, 6) INTO @nextMonth;
#--对上面的SQL语句拆分分析:
#MySQL时间函数date_add()为日期增加一个时间间隔,此sql的意思就是当前日期增加一个月后的日期
#select DATE_ADD(CURDATE(), INTERVAL 1 MONTH);
##返回20201006
#select replace('2020-10-06', '-', '');
##返回20201006
#select replace(DATE_ADD(CURDATE(), INTERVAL 1 MONTH), '-', '');
##返回202010
#SELECT SUBSTR(20201006,1,6);
##赋值到变量@nextMonth 中
#SELECT SUBSTR(20201006,1,6) INTO @nextMonth;
# 表1
#设置表前缀变量值为td_user_banks_log_
set @table_prefix = 'td_user_banks_log_';
#定义表1的名称
SET @tableName_1 = CONCAT(@table_prefix, @nextMonth);
##定义创建表的SQL语句
set @csql=concat("create table if not exists ",@tableName_1,"(
`id` int(11) NOT NULL AUTO_INCREMENT,
`app_id` varchar(100) NOT NULL,
`user_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户ID',
`type` tinyint(2) NOT NULL DEFAULT '1' COMMENT '1 签到奖励 2 活动奖励 3 兑换',
`gold_coin` int(11) NOT NULL,
`remarks` varchar(200) NOT NULL DEFAULT '' COMMENT '备注',
`create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `app_id` (`app_id`),
KEY `user_id` (`user_id`),
KEY `type` (`type`),
KEY `create_at` (`create_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
#PREPARE介绍:
##语句用于预备一个语句,并指定名称statement_name,以后引用该语句。语句名称对大小写不敏感。
##preparable_stmt可以是一个文字字符串,也可以是一个包含了语句文本的用户变量。该文本必须表现为一个单一的SQL语句,而不是多个语句。
PREPARE create_stmt from @csql;
EXECUTE create_stmt;
DEALLOCATE PREPARE create_stmt;
# 表2 和表1是同样的SQL,此处不做介绍:
set @table_prefix = 'td_sign_log_';
SET @tableName_2 = CONCAT(@table_prefix, @nextMonth);
set @csql=concat("create table if not exists ",@tableName_2,"(
`id` int(11) NOT NULL AUTO_INCREMENT,
`app_id` varchar(100) NOT NULL,
`user_id` int(11) NOT NULL,
`day` int(11) NOT NULL DEFAULT '0' COMMENT '天',
`sign_type` tinyint(2) NOT NULL DEFAULT '1' COMMENT '1 签到 2 补签 3 累计奖励',
`type` tinyint(2) NOT NULL DEFAULT '1' COMMENT '1 金币',
`num` int(11) NOT NULL DEFAULT '0',
`data_id` int(11) NOT NULL DEFAULT '0',
`create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `app_id` (`app_id`),
KEY `user_id` (`user_id`),
KEY `type` (`type`),
KEY `data_id` (`data_id`),
KEY `create_at` (`create_at`),
KEY `sign_type` (`sign_type`),
KEY `day` (`day`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
PREPARE create_stmt from @csql;
EXECUTE create_stmt;
DEALLOCATE PREPARE create_stmt;
SELECT COUNT(1) INTO @outputParam FROM information_schema.`TABLES` WHERE TABLE_NAME in (@tableName_1, @tableName_2);
SELECT @outputParam;
END //
delimiter ;
#--每月创建一个当月表的定时任务:
create EVENT `create_table_by_month` ON SCHEDULE EVERY 1 MONTH STARTS '2020-09-06 12:40:00' ON COMPLETION NOT PRESERVE ENABLE DO call create_table_by_month();
常识提示:在计划任务中,某个具体的时间来调用存储过程SQL1语句执行。这个指定的具体时间必须是将来的时间才可以的
#查看创建存储过程的SQL语句:
show create PROCEDURE create_table_by_month\G
#删除存储过程:
DROP PROCEDURE IF EXISTS create_table_by_month;
#删除计划任务
drop event create_table_by_month1;
以上存储过程的SQL语句和定时器的SQL语句都是生产环境使用过的
#排查报错:
发现mysql的日志报错,原来的存储过程的SQL语句里面增加的索引键字段正好是表中不存在的字段,所以包下面的错误。于是去掉存储过程中的索引键字段SQL就OK了。
2020-09-06T12:40:00.244879+08:00 604392 [ERROR] Event Scheduler: [root@localhost][test0001.create_table_by_month1] Key column 'sign_date' doesn't exist in table
2020-09-06T12:40:00.244926+08:00 604392 [Note] Event Scheduler: [root@localhost].[test0001.create_table_by_month1] event execution failed.
上述的存储过程只是本博主线上业务环境的SQL,切勿直接套用,造成损失与本博文无关。鉴于学习交流初心发表此处,仅供大家学习交流参考用。
mysql 按月建表_MySQL之存储过程按月创建表相关推荐
- mysql 存储过程创建表_MySQL之存储过程按月创建表的方法步骤
具体不多说,直接上代码.欢迎一起交流和学习. 创建一个按月创建表的存储过程,SQL语句如下: DELIMITER // DROP PROCEDURE IF EXISTS create_table_by ...
- Mysql之存储过程,动态创建表和数据库-,动态删除-yellowcong
今天在弄mycat 的时候,有一个需求,就是创建12个数据库,然后数据库里面都创建一个表,我当时想象,这个玩意也不难,于是寻思通过存储过程来动态创建表,只需要传递进来数据的前缀名称和表名称,即可创建1 ...
- mysql 存储过程月单拆天单_MySQL之存储过程按月创建表
具体不多说,直接上代码.欢迎一起交流和学习. 创建一个按月创建表的存储过程,SQL语句如下: DELIMITER // DROP PROCEDURE IF EXISTS create_table_by ...
- mysql 存储过程月单拆天单_MySQL之存储过程按月创建表的方法步骤
具体不多说,直接上代码.欢迎一起交流和学习. 创建一个按月创建表的存储过程,SQL语句如下: DELIMITER // DROP PROCEDURE IF EXISTS create_table_by ...
- mysql存储过程没有此表_mysql用存储过程写入 一个表A中没有存在在另一个表B的数据...
需求 Abiao id content 1 sfsdfsg 2 ddsgffd 3 gfggg 4 dggfhfd Bbiao id 2 3 那么我要查询到Abiao 里面在Bbiao没有的数据 (理 ...
- mysql 压力测试知乎_MySQL 对于千万级的大表要怎么优化? - MySQL
很多人第一反应是各种切分:我给的顺序是: 第一优化你的sql和索引: 第二加缓存,memcached,redis: 第三以上都做了后,还是慢,就做主从复制或主主复制,读写分离,可以在应用层做,效率高, ...
- mysql函数如何调用过程_MySQL调用存储过程和函数
存储过程和存储函数都是存储在服务器端的 sql 语句集合.要想使用这些已经定义好的存储过程和存储函数就必须要通过调用的方式来实现. 存储过程通过 CALL 语句来调用,存储函数的使用方法与 MysqL ...
- mysql怎么创建表视频教程_mySQL学习入门教程——2.创建表
二.创建表 一.创建数据表的SQL语句模型(弱类型) CREATE TABLE [IF NOT EXISTS] 表名称( 字段名1 列的类型[属性][索引], 字段名2 列的类型[属性][索引], - ...
- mysql 授权是哪一个表_MySQL授权系统的五个表
MySQL授权系统是由数据库中的五个表来实现,下面就为您详细介绍这五个和MySQL授权系统相关的表,如果您感兴趣的话,不妨一看. MySQL服务器的特点之一是,它在控制每个用户行为方面提供了极大的灵活 ...
最新文章
- ZeroMQ实例-使用ZeroMQ进行windows与linux之间的通信
- PHP移动文件指针ftell()、fseek()、rewind()总结
- python打开一个文件夹下所有txt文件-python读取一个目录下所有txt里面的内容方法...
- python系统-python实现用户登录系统
- LeetCode Remove Nth Node From End of List
- 二章: CentOS6.5 连接FTP服务器、部署telnet服务、安装SCP、服务端FTP、SFTP部署
- 《面向模式的软件体系结构1--模式系统》读书笔记(5)--- 管理
- Python的系统管理_12_rrdtool
- php 标点符号反转,PHP删除标点符号(无破折号)
- java处理unicode_C# JavaScript Java 与 中文 unicode 处理
- 【包邮送书活动】20210924期-开奖通知
- Simulink之单管非隔离直流斩波器
- 2010版EXCEL下方sheet工作表隐藏了
- Hive 使用问题集锦
- 【渝粤题库】陕西师范大学165101社会学 作业(高起专)
- 人工合成生命的最新进展比AI还快
- linux rm批量,Linux rm删除大批量文件
- 微博评论数据——requests——保存在本地
- 【区块链】深入剖析免费赚钱app的本质
- Node.js 4.x 入门实战视频课程【讲师辅导】-曾亮-专题视频课程
热门文章
- gpio mysql_GPIO控制LED
- java link 使用_Java数据结构之简单的连接点(link)实现方法示例
- formrules 表单验证限制最大值_HTML5表单
- spring ioc原理_干了5年的Java面试官,把他喜欢问的几十个Spring面试题告诉我了
- linux下docker安装步骤_linux下安装mysql8步骤
- 感恩节日海报设计模板|简洁优雅的花卉主题海报
- 小雪节气艺术字体设计PNG素材 | 希望可以温暖到你了
- UI设计师必定需要了解的sketch素材
- 财务金融类网页及app界面设计模板
- 手机移动端APP引导界面设计模板素材,分层可临摹