關於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; 

記下這編文章,以作備忘。也希望能幫到其他遇到此問題的同學。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM