mysqlストレージ・プロシージャの動的テーブル名およびパラメータ処理の作成について



転載は出典を明記してください:カーテン巻き西風のコラム(http://blog.csdn.net/ljxfblog) 
最近ゲームは第2回の内测を始めて、操作の日志を処理し始めて、最初は日志を同じ表の中に置いて、1日の时间を発见して、平均100プレイヤーはオンラインで、操作の记录は13万本を超えて、表を分解することを决めて、日付によって日志を保存して、毎日の日志は1つの表の中に保存して、それから定期的に古いデータを导いてバックアップした后に削除します.
具体的には、日記を書くとき、現在の時間によって当日の表に挿入することを決め、表が存在しない場合は新しい表を作成し、表名に当日の日付をつける.これは、ストレージ・プロシージャ内で日付に関連するテーブルを動的に作成する必要があることに関連します.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; 

この文章をメモして,メモをとる.この問題に直面している他の学生にも助けてほしい.