关于mysql存储过程创建动态表名及參数处理
近期游戏開始第二次内測,開始处理操作日志。最開始把日志放到同一个表里面,发现一天时间,平均100玩家在线。操作记录就超过13万条,决定拆表。依照日期来保存日志。每天的日志存到一个表里面,然后定期把老的数据导出来备份后删掉。
详细思路是写日志的时候,依据当前的时间决定插入到当天的表里面。如表不存在则创建一个新的表。表名里面带上当天的日期。这就涉及到须要在存储过程里面动态创建一个跟日期相关的表。mysql不是非常熟悉,仅仅会主要的语法,这样的高级功能都须要上网查询,呵呵。
最開始的想法。是想定义一个字符串变量,把表名拼好后来创建表,发现创建的表名是定义的变量名,仅仅好又一次想办法。
经过查资料,并试验了非常多次,最后找到了实现的方法,须要先将sql语句拼出来。然后在使用PREPARE来处理就能够了。sql语句例如以下:
set @sql_create_table = concat(
'CREATE TABLE IF NOT EXISTS operrecord_', date_format(curdate(),'%y%m%d'),
"(
`oper_id` int(10) NOT NULL AUTO_INCREMENT,
`oper_role` int(11) NOT NULL,
`oper_type` varchar(30) NOT NULL DEFAULT '',
`oper_content` varchar(1000) NOT NULL DEFAULT '',
`oper_cls` int(10) NOT NULL DEFAULT '0',
`oper_date` datetime NOT NULL,
`oper_serverid` int(11) NOT NULL DEFAULT '1',
PRIMARY KEY (`oper_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8"); PREPARE sql_create_table FROM @sql_create_table;
EXECUTE sql_create_table;
创建表之后,还须要插入数据,可是insert语句里面也要使用动态表名,没办法还是须要和上面一样的方法来处理。先拼sql语句。示比例如以下:(注:rId等是存储过程传入的參数)
set @sql_oper_revcord = concat(
"INSERT INTO operrecord_", date_format(curdate(),'%y%m%d'),
" (`oper_role`, `oper_type`, `oper_content`, `oper_cls`, `oper_serverid`, `oper_date`)
values (rId, type, content, cls, serverid, NOW())"); PREPARE sql_oper_revcord FROM @sql_oper_revcord;
EXECUTE sql_oper_revcord;
运行的时候发现会报错,找不到rId这个字段。网上说应该给rId加上引號如('rId')也不行,继续报错数据类型不匹配。
想了想。应该把rId这些传人的參数声明为局部參数,再次測试果然成功了,另外须要注意的是表字段在字符串里面须要加上(`xxx`)才行。正确的sql语句例如以下:
set @rId = rId, @type = type, @content = content, @cls = cls, @serverid = serverid;
set @sql_oper_revcord = concat(
"INSERT INTO operrecord_", date_format(curdate(),'%y%m%d'),
" (`oper_role`, `oper_type`, `oper_content`, `oper_cls`, `oper_serverid`, `oper_date`)
values (@rId, @type, @content, @cls, @serverid, NOW())"); PREPARE sql_oper_revcord FROM @sql_oper_revcord;
EXECUTE sql_oper_revcord;
记下这编文章,以作备忘。也希望能帮到其他遇到此问题的同学。
关于mysql存储过程创建动态表名及參数处理的更多相关文章
- mysql 存储过程 动态表名
今天写存储过程时,遇到要将表名最为参数的问题,如果不涉及到游标的话,使用prepare可以解决问题,但是,动态表名要运用在游标中的话,则prepare就得靠边站了. 集众人之智慧,最后,使用临时表解决 ...
- 让 MySQL 在 Linux 下表名不区分大小写(实为表名全小写)
把 Windows 下的应用部署到 Linux 下,使用到了 Quartz 集群的特性,所以建了 MySql 的中间表,一启动看到报错: Invocation of init method faile ...
- MySQL 存储过程删除大表
1.权限问题 alter routine 编辑或删除存储过程 create routine 建立存储过程 execute 创建存储过程 2.存储过程相关的一些命令 show procedure sta ...
- MySQL在创建数据表的时候创建索引
转载:http://www.baike369.com/content/?id=5478 MySQL在创建数据表的时候创建索引 在MySQL中创建表的时候,可以直接创建索引.基本的语法格式如下: CRE ...
- 数据分表Mybatis Plus动态表名最优方案的探索
一.应用场景 大家在使用Mybatis进行开发的时候,经常会遇到一种情况:按照月份month将数据放在不同的表里面,查询数据的时候需要跟不同的月份month去查询不同的表. 但是我们都知道,Mybat ...
- 4.mysql数据库创建,表中创建模具模板脚本,mysql_SQL99标准连接查询(恩,外部连接,全外连接,交叉连接)
mysql数据库创建,表创建模等模板脚本 -- 用root用户登录系统,运行脚本 -- 创建数据库 create database mydb61 character set utf8 ; -- ...
- mysql解决select * from 表名 (where + 约束条件为空)
mysql解决select * from 表名 (where + 约束条件为空),示例如下: SELECT * from tableName WHERE name is NULL; 从 tableNa ...
- hibernate动态表名映射
引自:http://blog.csdn.net/xvshu/article/details/39187779 最近的一个项目有一个需求,有N个考核单位,要对每个考核单位生成一张考核情况表,这样做的目的 ...
- 使用dao时,如何同时使用动态表名和过滤字段?
使用dao时,如何同时使用动态表名和过滤字段? 发布于 630天前 作者 wukonggg 316 次浏览 复制 上一个帖子 下一个帖子 标签: 无 如题.求样例代码 1 回复 wend ...
随机推荐
- python的vim的环境配置(后续慢慢补充进来)
#vim ~/.vimrc set smartindent set smarttab set expandtab set tabstop= set softtabshtop= set shiftwid ...
- (3) go 指针
1.获取地址 取地址 &i 2.指针 var p *int=&i ptr 是一个地址 *ptr 是可看成一个变量,该地址所在的变量,也就是 num 3.常见值类型 引用类型 值类型:栈 ...
- 【SQL】ORACLE在sqlplus中使用spool方式生成建表语句
在实际生产中有时我们需要将一张表的数据导入到另外一张表,如果有PLSQL,我们可以通过PLSQL工具将数据导出为sql脚本,然后再在另外一个数据库中执行这个脚本.但有时在实际生产中我们没有PLSQL这 ...
- HTML的介绍
什么是HTML? HTML:Hyper Text Markup Language :超文本标记语言. 超文本:功能比普通文本更加强大 标记语言:使用一组标签对内容进行描述的语言,它不是编程语言 htm ...
- 木材加工(LintCode)
木材加工 有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为 k.当然,我们希望得到的小段越长越好,你需要计算能够得到的小段木头的最大长度. 样例 有3根木头[232 ...
- [Lydsy1806月赛] 最长公共子序列
首先可以证明,只由一种字符构成的串总会是最优解中的一种... 考虑随便一个T与S的LIS都至少是出现次数最少的字符个数(考虑反证法,如果要更短,那么T中每种字符的个数都至多是 S 中最少的字符个数-1 ...
- ZXing for Android 修改为竖屏模式
zxing github连接:https://github.com/zxing/zxing 以下为修改方法 Step 1: Add following lines to rotate data bef ...
- 推荐系统中的SVD
本文主要参考:Factorization Meets the Neighborhood: a Multifaceted Collaborative Filtering Model 在用户对自己需求相对 ...
- web安全之如何防止CSRF跨站请求伪造
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站 ...
- ArcGIS 10.6 安装破解教程
美国时间2018年1月17日,ArcGIS 10.6正式面向用户发布!10.6带来更完善的产品体系框架,同时全面拥抱前沿IT技术,升级平台大数据.三维.影像等核心能力,为我们打造了一个功能强大,性 ...