Ric*_*ard 5 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;
Run Code Online (Sandbox Code Playgroud)
我在尝试创建过程时遇到的错误是:
脚本行:4 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 'CONCAT("mmis", FORMAT(vesselID,0)), shipID; 附近使用的正确语法;
我试过这个:
编辑:
来自@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;
Run Code Online (Sandbox Code Playgroud)
您不能?在准备好的语句中用a 替换表名,然后让执行插入表名。
动态表名称通常是一个坏主意:最好创建 1 个大表,并为“虚拟表名称”添加一个额外的(索引)列。
如果您确实需要动态表,则必须将表名连接到 PREPARE本身中。
假设不是将所有用户放入一张users包含ID, Name, e-mail, country,列的表中...,而是将它们放入包含 , , , 列的动态表users_country, ID, Name,e-mail...
您无法轻松查询所有表。假设您想知道有多少用户是男性 - 您必须查询每个表,并对结果进行 UNION。不会更快。
无论如何,您都可以使用 PARTITIONS 物理拆分表,但您的逻辑视图仍然相同。您认为使用单独的表所具有的任何优势通常都可以使用另一种方法来实现。