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怎么创建表视频教程_mySQL学习入门教程——2.创建表
二.创建表 一.创建数据表的SQL语句模型(弱类型) CREATE TABLE [IF NOT EXISTS] 表名称( 字段名1 列的类型[属性][索引], 字段名2 列的类型[属性][索引], - ...
- mysql 存储过程月单拆天单_为部门整理的mysql_db使用军规
mysql_db使用军规: 1.禁止开发测试人员在IDC环境手工删除和修改数据 2.所有需求通过DB工具系统提交 3.禁止在IDC环境DB进行测试 4.IDC环境提交的sql语句一定要经过非正式环境验 ...
- mysql的查询每个月的1号_MySql查询当年1-12月数据
mysql查询当年1-12月数据. select count(*) as jantradingvolume, coalesce(sum(tt.amount),0) as janamount, (sel ...
- mysql存储过程语法和游标的语法_MySQL游标存储过程-语法点滴
CREATE PROCEDURE my_proc() BEGIN -- 需要定义接收游标数据的变量 DECLARE sname VARCHAR(100); DECLARE cattype VARCHA ...
- mysql 异常关机后 无法查数据_MySQL数据库非法关机造成数据表损坏怎么排查 | 学步园...
该篇文章我们介绍由于非法硬件关机,造成了MySQL数据库的数据表损坏,数据库不能正常运行的一个实例.下面学步园小编来讲解下MySQL数据库非法关机造成数据表损坏怎么排查? MySQL数据库非法关机造成 ...
- mysql中如何删除多个表格_mysql怎么批量删除多个表?
mysql批量删除多个表的方法:使用"DROP TABLE"语句,只要将表名依次写在后面,相互之间用逗号隔开即可:语法格式"DROP TABLE [IF EXISTS] ...
- mysql中删除标识列的语句_MySQL中一些常用的数据表操作语句笔记
0.创建表 CREATE TABLE 表名 (属性名 数据类型 [完整性约束条件], 属性名 数据类型 [完整性约束条件], 属性名 数据类型 [完整性约束条件]) "完整性约束条件&quo ...
- mysql查询出来的数据用连接_mysql – 使用查询从连接的表中检索数据
我想做的事: 我想检索有关客户的所有数据字段(包括与他相关的表中的所有数据(例如,引用的国家和数据字段的数据字段) 我想将我的查询作为idUser的参数. 这是我的EER图: 我尝试了什么: SELE ...
最新文章
- h5页面笔按下默认是拖动,H5中在拖动的元素或选择的文本进入到有效的放置目标时触发的事件ondragenter...
- WinXP/2000操作系统自动关机的实现
- onnx模型部署(一) ONNXRuntime
- linux 切换python版本_linux下多个python版本切换如何设置
- 文明重启服务器维护怎么卡进去,文明重启更新之后进不去,具体玩法介绍
- IE8开发人员工具资料
- 安卓中经常使用控件遇到问题解决方法(持续更新和发现篇幅)(在textview上加一条线、待续)...
- npoi 所有列调整为一页_别再浪费纸了,一张纸就能打印Word、Excel、PPT所有内容,真厉害...
- python字典更改元素_python – 返回带有一个已更改元素的字典
- Java学习关于集合框架的基础接口--Collection接口
- mysql集群方案,保准看明白!
- 程序员——神圣的职业
- vs2008 清理后再编译后卡顿_更新后,竟有这么“严重”的后果?
- c++ 编程规范技巧
- paip.提升用户体验---论文本编辑器的色彩方案
- Linux源码编译bison和flex
- EnableQ在企业员工满意度调查上的贡献
- 清华大学超级计算机中心,中国科学技术大学超级计算中心
- 京东云的区块链“经”
- html特殊符号小企鹅,企鹅侦探名字如何取特殊 名字可以使用的特殊符号
热门文章
- 乾坤符和鸿蒙符,少年三国志四种暗金兵符技能怎么样 四种暗金兵符技能分析...
- C语言实现数据文件怎么找,急求如何将下列C语言程序数据存储到文件中?
- html5 popup,popup.js-jQuery和CSS3可互动的3D弹出窗口插件
- html增加状态信息管理代码,JavaScript+HTML实现学生信息管理系统
- java中保存图片到本地_java保存网络图片到本地
- python xml字符串和dict字典互转
- 交换友链的几个技巧!
- 【Harvest源码分析】NuttallWindow
- LeetCode 542. 01 Matrix--C++解法--动态规划
- LeetCode 17. Letter Combinations of a Phone Number--笔试题--C++,Python解法