裏MySQL クエリー入門 (9) 基礎編7 動的クエリー

MySQLで動的クエリーを実行する為にプリペアド ステートメントを使います。

PREPAREでSQLを定義し、EXECUTEでPREPAREで定義したSQLを実行します。

PREPARE stmt_name FROM preparable_stmt
EXECUTE stmt_name [USING @var_name [, @var_name] ...]
  • UPDATE型のバックアップSQLを作成する動的SQL
SET @tbl:='pref';
SET @pkey:=(SELECT COLUMN_NAME 
FROM information_schema.`COLUMNS` 
WHERE TABLE_NAME=@tbl 
  AND COLUMN_KEY='PRI');

SET @updates:=(SELECT GROUP_CONCAT(CONCAT('\'',COLUMN_NAME,'=\\\'\',',COLUMN_NAME,',\'\\\'\',') SEPARATOR '\',\',') 
FROM information_schema.`COLUMNS` 
WHERE TABLE_NAME=@tbl 
  AND COLUMN_KEY<>'PRI');

SET @sql:=CONCAT('SELECT CONCAT(\'UPDATE ',@tbl,' SET \',',@updates,'\' WHERE ',@pkey,'=\',',@pkey,',\'\\\'\') 
FROM ',@tbl);

PREPARE update_backup FROM @sql;
EXECUTE update_backup; 

※ 7/9 実際に動くものに置き換え、日本語が文字化けたり、エスケープが完璧ではないので、後日改めて差し替えます。