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;
未経験でエンジニアを目指すなら

ファンブリューではエンジニアになりたい人を支援しています。

現在こんなお悩みがあれば、ぜひ一度ご相談ください。

  • プログラミングを学習したいが、何から始めたらいいかわからない。
  • IT業界に就職するために必要な知識が何かわからない。
  • 実務経験がなくて現場に入れない

金井 泰樹のアバター 金井 泰樹 FUNBREW代表

FUNBREWの代表。
新卒からIT系の企業に勤め、SES、スマホアプリ開発、自社開発の会社で経験を積んで独立。
新卒時代にエンジニアとしてのキャリアを積むのに失敗し、その後に苦労した経験から、現在教育事業の立ち上げを準備中。
強みはウェブシステム開発全般と迅速なレスポンスです。

目次