转载请注明出处:帘卷西风的专栏(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;

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

关于mysql存储过程创建动态表名及參数处理的更多相关文章

  1. mysql 存储过程 动态表名

    今天写存储过程时,遇到要将表名最为参数的问题,如果不涉及到游标的话,使用prepare可以解决问题,但是,动态表名要运用在游标中的话,则prepare就得靠边站了. 集众人之智慧,最后,使用临时表解决 ...

  2. 让 MySQL 在 Linux 下表名不区分大小写(实为表名全小写)

    把 Windows 下的应用部署到 Linux 下,使用到了 Quartz 集群的特性,所以建了 MySql 的中间表,一启动看到报错: Invocation of init method faile ...

  3. MySQL 存储过程删除大表

    1.权限问题 alter routine 编辑或删除存储过程 create routine 建立存储过程 execute 创建存储过程 2.存储过程相关的一些命令 show procedure sta ...

  4. MySQL在创建数据表的时候创建索引

    转载:http://www.baike369.com/content/?id=5478 MySQL在创建数据表的时候创建索引 在MySQL中创建表的时候,可以直接创建索引.基本的语法格式如下: CRE ...

  5. 数据分表Mybatis Plus动态表名最优方案的探索

    一.应用场景 大家在使用Mybatis进行开发的时候,经常会遇到一种情况:按照月份month将数据放在不同的表里面,查询数据的时候需要跟不同的月份month去查询不同的表. 但是我们都知道,Mybat ...

  6. 4.mysql数据库创建,表中创建模具模板脚本,mysql_SQL99标准连接查询(恩,外部连接,全外连接,交叉连接)

     mysql数据库创建,表创建模等模板脚本 -- 用root用户登录系统,运行脚本 -- 创建数据库 create database mydb61 character set utf8 ; -- ...

  7. mysql解决select * from 表名 (where + 约束条件为空)

    mysql解决select * from 表名 (where + 约束条件为空),示例如下: SELECT * from tableName WHERE name is NULL; 从 tableNa ...

  8. hibernate动态表名映射

    引自:http://blog.csdn.net/xvshu/article/details/39187779 最近的一个项目有一个需求,有N个考核单位,要对每个考核单位生成一张考核情况表,这样做的目的 ...

  9. 使用dao时,如何同时使用动态表名和过滤字段?

    使用dao时,如何同时使用动态表名和过滤字段?  发布于 630天前  作者 wukonggg  316 次浏览  复制  上一个帖子  下一个帖子  标签: 无 如题.求样例代码 1 回复 wend ...

随机推荐

  1. 【剑指offer】面试题 64. 求 1+2+3+...+n

    面试题 64. 求 1+2+3+...+n 题目:求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 1.采 ...

  2. Linux基础系列-Day9

    算术运算符 设置变量a=10,b=4 + 加法 [root@localhost ~]# echo $[$a+$b] 14 - 减法 [root@localhost ~]# echo $[$a-$b] ...

  3. 多协议注入工具t50

    多协议注入工具t50   t50是Kali Linux自带的一款网络数据包注入工具.该工具支持15种协议,不仅涵盖常规协议(ICMP.TCP.UDP),还涵盖基础协议和路由协议(GRE.IPSec.R ...

  4. ccpc秦皇岛部分题解

    A. 题意:就是有一个大桌子,环绕有顺势站1~m共m个座位,n个选手坐在部分位置上.然后如果有一个人a了一道题,却没有立刻发气球给他,他产生怒气值是发气球给他的时间减去a题时间.现在有一个机器人顺时针 ...

  5. BZOJ 2809 [Apio2012]dispatching(斜堆+树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2809 [题目大意] 给出一棵树,求出每个点有个权值,和一个乘算值,请选取一棵子树, 并 ...

  6. BZOJ 2242 [SDOI2011]计算器(快速幂+Exgcd+BSGS)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2242 [题目大意] 给出T和K 对于K=1,计算 Y^Z Mod P 的值 对于K=2 ...

  7. BZOJ 1257 [CQOI2007]余数之和sum(分块)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1257 [题目大意] 给出正整数n和k,计算j(n,k)=k mod 1 + k mod ...

  8. 【动态规划】mr354-坐车看球

    [题目大意] 两个球队的支持者要一起坐车去看球,他们已经排成了一列.我们要让他们分乘若干辆巴士,同一辆巴士上的人必须在队伍中是连续的.为了在车上不起冲突,希望两队的支持者人数尽量相等,差至多是D.有一 ...

  9. bzoj 1689: [Usaco2005 Open] Muddy roads 泥泞的路

    1689: [Usaco2005 Open] Muddy roads 泥泞的路 Description Farmer John has a problem: the dirt road from hi ...

  10. 20162325金立清 实验四 Android程序设计 实验报告

    实验四 Android程序设计 实验报告 代码托管地址 码云链接 实验内容 安装使用Android Stuidio Activity测试 UI测试 布局测试 事件处理测试 Android程序设计-1 ...