MySQLのprepareでテーブル名をプレースホルダーにすることはできない

タイトルの通りなのですが、データのメンテナンスでテーブルを動的に作りたいことがあり、prepare を試したところ、うまく行きませんでした。

メモも兼ねて対応策を記載しておきます。

次の例はテーブル名をプレースホルダーにして、実行させているのですが失敗します。

set @stmt = 'CREATE TABLE ? (id INT)';
set @name = 'prepare_test';
PREPARE stmt FROM @stmt;
EXECUTE stmt USING @name; -- Query 4 ERROR: Unknown prepared statement handler (stmt) given to EXECUTE

EXECUTEを抜いて実行すると違うエラーになります。

どうやら文法が間違っているとのこと。

set @stmt = 'CREATE TABLE ? (id INT)';
set @name = 'prepare_test';
PREPARE stmt FROM @stmt; -- Query 3 ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? (id INT)' at line 1

試しにprepare_testというテーブルを先に作成して、以下のSQLを実行すると成功します。

set @stmt = 'select ? from prepare_test';
set @column = 'id';
PREPARE stmt FROM @stmt;
EXECUTE stmt USING @column;

しかし、テーブル名をプレースホルダーにすると先ほどと同じように文法エラーになります。

set @stmt = 'select id from ?';
set @column = 'prepare_test';
PREPARE stmt FROM @stmt; -- Query 3 ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1

では対策がないのかというと、そうでもなく。

プレースホルダーをやめて、クエリをあらかじめ完成させておくと問題なく実行できます。

set @name = 'prepare_test';
set @stmt = CONCAT('CREATE TABLE ', @name, ' (id INT)');
PREPARE stmt FROM @stmt;
EXECUTE stmt;

システム開発のご相談はお気軽に

要件定義から運用まで、お客様のビジネスに最適なシステムをご提案いたします。
まずはお気軽にご相談ください。

初回相談無料 お見積もり無料 土日対応
今月の見積もり受付、残り2社様です

小さな会社なので、お客様一社一社に丁寧に向き合うため、
同時にお受けできる案件数に限りがございます

お問い合わせ・ご相談
先月32件のご相談

お探しの情報は見つかりましたか?

ご不明な点やご相談したいことがございましたら、
お気軽にお問い合わせください。

無料相談 オンライン対応 営業電話なし
お問い合わせはこちら