关于mysql存储过程创建动态表名及参数处理

转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog) 

最近游戏开始第二次内测,开始处理操作日志,最开始把日志放到同一个表里面,发现一天时间,平均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; 

记下这编文章,以作备忘。也希望能帮到其它遇到此问题的同学。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Ken的杂谈

【系统设置】CentOS 修改机器名

18430
来自专栏web前端教室

你可以从面试中学到什么?

讲一下我对面试的一些。。。“偏见”,哈哈,熟悉我的同学们一定要批判的读接下来的内容哈。

12400
来自专栏haifeiWu与他朋友们的专栏

复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负...

31040
来自专栏钱塘大数据

中国互联网协会发布:《2018中国互联网发展报告》

在2018中国互联网大会闭幕论坛上,中国互联网协会正式发布《中国互联网发展报告2018》(以下简称《报告》)。《中国互联网发展报告》是由中国互联网协会与中国互联...

13850
来自专栏前端桃园

知识体系解决迷茫的你

最近在星球里群里都有小伙伴说道自己对未来的路比较迷茫,一旦闲下来就不知道自己改干啥,今天我这篇文章就是让你觉得一天给你 25 个小时你都不够用,觉得睡觉都是浪费...

22540
来自专栏腾讯NEXT学位

今天我就说三句话

11820
来自专栏钱塘大数据

理工男图解零维到十维空间,烧脑已过度,受不了啦!

让我们从一个点开始,和我们几何意义上的点一样,它没有大小、没有维度。它只是被想象出来的、作为标志一个位置的点。它什么也没有,空间、时间通通不存在,这就是零维度。

35230
来自专栏微信公众号:小白课代表

不只是软件,在线也可以免费下载百度文库了。

不管是学生,还是职场员工,下载各种文档几乎是不可避免的,各种XXX.docx,XXX.pptx更是家常便饭,人们最常用的就是百度文库,豆丁文库,道客巴巴这些下载...

44830
来自专栏FSociety

SQL中GROUP BY用法示例

GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类...

5.2K20
来自专栏腾讯大讲堂的专栏

白底黑字or黑底白字,眼睛更喜欢哪一个?

12410

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励