关于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 ...
随机推荐
- Java实现POI读取Excel文件,兼容后缀名xls和xlsx
1.引入所需的jar包: maven管理项目的话直接添加以下坐标即可: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -- ...
- ceph 安装记录
ceph 安装 http://docs.ceph.com/docs/master/start/quick-ceph-deploy/ 1. 系统要求 centos 7 systemctl disable ...
- HDU 4607.Park Visit-树的直径(BFS版)+结论公式(乱推公式)-备忘(加油!)
Park Visit Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- phpstorm中Xdebug的使用
目 录 1.Xdebug简介 2.Xdebug的安装.操作 2.1环境搭建 2.2配置php.ini 2.3配置PhpStorm 2.4配置PHP Debug 2.5进行调试 1.Xdebug简介 ...
- Linux前后台进程切换
(1).Linux前台进程与后台进程的区别 前台进程:是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随之消失. 后台进程:也叫守护进程(Daemon),是运行在后台的 ...
- 【找规律】【DFS】Gym - 101174H - Pascal's Hyper-Pyramids
二维下,如果把杨辉三角按照题目里要求的那样摆放,容易发现,第i行第j列的数(从0开始标号)是C(i+j,i)*C(j,j). 高维下也有类似规律,比如三维下,最后一层的数其实是C(i+j+k,i)*C ...
- 8VC Venture Cup 2016 - Elimination Round A. Robot Sequence 暴力
A. Robot Sequence 题目连接: http://www.codeforces.com/contest/626/problem/A Description Calvin the robot ...
- CentOS 6.9下KVM虚拟机网络Bridge(网桥)方式与NAT方式详解(转)
摘要:KVM虚拟机网络配置的两种方式:NAT方式和Bridge方式.Bridge方式的配置原理和步骤.Bridge方式适用于服务器主机的虚拟化.NAT方式适用于桌面主机的虚拟化. NAT的网络结构图: ...
- Ubuntu 16.04重启Nautilus
关闭: nautilus -q 启动: 不要在命令行启动,直接在Dash中找到“文件”,然后启动,这样就可以在后台直接运行.
- NHibernate 继承映射(第十六篇)
在NHibernate的映射中,关于继承的映射策略有3种方式 单表继承 类表继承 具体表继承 另外还有一种比较特别的多态映射 隐式多态 下面分别来阐述NHibernate继承映射的各种策略要点. 一. ...