タイトルの通りなのですが、データのメンテナンスでテーブルを動的に作りたいことがあり、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業界に就職するために必要な知識が何かわからない。
- 実務経験がなくて現場に入れない