通过存储过程创建具有动态名称的表

时间:2011-10-25 12:16:27

标签: mysql stored-procedures dynamic

我正在尝试使用动态名称创建表。我收到错误的代码是一段动态SQL。我不确定问题是什么。我是动态SQL和存储过程的新手。

    PREPARE stmt FROM "CREATE TABLE `?` SELECT lat, lon, nfldtime FROM position_reports where mmsi = ? ORDER BY id DESC LIMIT 100";    

    EXECUTE stmt USING CONCAT("mmis", FORMAT(vesselID,0)), vesselID;

尝试创建过程时遇到的错误是:

  

脚本行:4您的SQL语法中有错误;检查手册   对应于您的MySQL服务器版本,以获得正确的语法   在'CONCAT(“mmis”,FORMAT(vesselID,0))附近使用,vesselID;

我试过了:

编辑:

来自@Konerak的

现在回答这个问题:

set @s = CONCAT("CREATE TABLE mmsi", vesselID, " SELECT lat, lon, nfldtime FROM position_reports where mmsi = ", vesselID, " ORDER BY id DESC LIMIT 100");
prepare createTable from @s;
EXECUTE createTable;
DEALLOCATE PREPARE createTable;

1 个答案:

答案 0 :(得分:3)

无法在预准备语句中用?替换表名,然后让执行插入表名。

动态表名通常是坏主意:最好制作1个大表,并为“虚拟表名”添加额外(索引)列。

如果你真的需要动态表,你必须将表名连接到PREPARE 本身。

动态表名称的Pro和con

假设不是将所有用户放在一个表中,users包含ID列,Namee-mailcountry... ,您将它们放入动态表users_country,列IDNamee-mail...

  • 您无法轻松查询所有表格。假设您想知道有多少用户是男性 - 您必须查询每个表,并且UNION结果。不会更快。

  • 无论如何,您可以使用PARTITIONS对表进行物理拆分,但您的逻辑视图仍然相同。您认为使用单独表格的任何优势通常可以使用其他方法获得。