SET @mytable= 'users' ;
SELECT * FROM @mytable;
このような設計は機能しません。 しかし、それを機能させるにはどうすればよいですか?
たとえば、データベース内のテーブルをアーカイブする手順を記述します。
この手順では、テーブル名をパラメーターとして使用し、engine = ARCHIVEを使用して別のテーブルを作成します
DELIMITER $$
DROP PROCEDURE IF EXISTS `create_archive`$$
CREATE PROCEDURE `create_archive`( IN current_table VARCHAR (50)
)
BEGIN
DECLARE template,archive_template VARCHAR (50);
-- mydata
-- mydata_20090226
SET archive_template=replace(curdate(),"-","");
SET template=CONCAT(current_table,"_",archive_template);
--
-- CREATE TABLE mydata_20090226 ENGINE_ARCHIVE
-- AS (SELECT * FROM mydata);
SET @archive_query:=CONCAT(" CREATE TABLE ",template," ENGINE=ARCHIVE AS
( SELECT * FROM ",current_table," )");
PREPARE archive_query FROM @archive_query;
EXECUTE archive_query;
DEALLOCATE PREPARE archive_query;
END $$
DELIMITER ;
動的クエリを作成するには、まずCONCAT()で収集してから、PREPARE、EXECUTEを使用して実行する必要があります。 このような方法は、プロシージャで複雑なクエリを作成するのに非常によく適用されます。 誰かが役に立つといいな。
UPD:テキストのタイプミスを修正、 Goganchicに感謝