我正在尝试使用动态名称创建表。我收到错误的代码是一段动态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;
答案 0 :(得分:3)
您无法在预准备语句中用?
替换表名,然后让执行插入表名。
动态表名通常是坏主意:最好制作1个大表,并为“虚拟表名”添加额外(索引)列。
如果你真的需要动态表,你必须将表名连接到PREPARE 本身。
假设不是将所有用户放在一个表中,users
包含ID
列,Name
,e-mail
,country
,...
,您将它们放入动态表users_country
,列ID
,Name
,e-mail
,...
您无法轻松查询所有表格。假设您想知道有多少用户是男性 - 您必须查询每个表,并且UNION结果。不会更快。
无论如何,您可以使用PARTITIONS对表进行物理拆分,但您的逻辑视图仍然相同。您认为使用单独表格的任何优势通常可以使用其他方法获得。