You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL用JSON数组按LIKE批量创建新表出现1064语法错误如何解决

报错原因

一共有3个核心语法错误导致执行失败:

  1. MySQL自定义函数必须显式声明返回值类型,你创建的example()函数没有定义RETURNS子句,如果不需要返回值应该改用存储过程(PROCEDURE)而不是函数,这也是你收到的报错指向BEGIN位置的直接原因。
  2. CREATE TABLE 等DDL语句不支持直接将JSON_VALUE()的返回值作为表名标识符,必须通过动态预处理SQL的方式拼接语句后执行。
  3. 循环内的CREATE TABLE语句末尾缺少分号结束符,不符合SQL语法规范。

解决方法

把自定义函数改成存储过程,内部用预处理语句动态生成建表SQL执行,修正后的代码如下:

DELIMITER //
CREATE PROCEDURE example()
BEGIN
  DECLARE _counter INT DEFAULT 0;
  DECLARE _orig_table VARCHAR(50);
  DECLARE _new_table VARCHAR(50);

  SET @origTables = '["tutorials_tb2","tutorials_tbl"]';
  SET @newTables = '["tutorials_tb2_new","tutorials_tbl_new"]';

  WHILE _counter < JSON_LENGTH(@origTables) DO
    -- 取出当前循环对应的原表名和新表名
    SET _orig_table = JSON_VALUE(@origTables, CONCAT('$[',_counter,']'));
    SET _new_table = JSON_VALUE(@newTables, CONCAT('$[',_counter,']'));
    -- 拼接动态建表语句
    SET @sql = CONCAT('CREATE TABLE ', _new_table, ' LIKE ', _orig_table);
    -- 预处理并执行SQL
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    -- 计数器自增
    SET _counter = _counter + 1;
  END WHILE;
END //
DELIMITER ;

-- 调用存储过程执行批量建表
CALL example();

内容的提问来源于stack exchange,提问作者Raja G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:06:04