c mysql 动态表名_关于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语句如下:

perl">

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值