• 关于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; 

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

  • 相关阅读:
    这才是世上最全的“软件测试”思维导图!
    Scrum3.0 敏捷开发白皮书
    敏捷软件质量保证的方法与实践
    C# DataGridView 列的显示顺序
    Xamarin.android 重写axml控件
    Xamarin控件使用之GridView
    Sql 的 RAISERROR用法
    Xamarin.Android 怎么定义一个按钮和返回键功能一样回到上一个界面
    Xamarin.android Activity动画切换效果实现
    Xamarin.Android之封装个简单的网络请求类
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7289699.html
Copyright © 2020-2023  润新知