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

MariaDB备份恢复至MySQL时存储过程语法报错求助

MariaDB备份恢复到MySQL的存储过程语法错误修复

问题核心

你遇到的语法错误来自不规范的索引创建语句,同时原有存储过程还存在子查询未命名、临时表创建语句未闭合的问题。报错行的正确索引创建语法在MySQL中需要明确关键字,且临时表的索引创建逻辑需要调整位置。

修复后的完整存储过程

CREATE PROCEDURE `createCompanyReviews`()
begin
    -- 创建临时表并插入聚合后的数据
    CREATE TEMPORARY TABLE IF NOT EXISTS company_reviews
    SELECT 
        review_to_company_id,
        IFNULL(SUM(rate) / COUNT(rate), 0) AS average,
        COUNT(rate) AS amount
    FROM (
        SELECT
            review_to_company_id,
            IFNULL(CEILING(AVG(NULLIF(crc.rate_amount, 0))), cr.initial_rate_amount) AS rate
        FROM T_COMPANY_REVIEW cr
        LEFT JOIN T_COMPANY_REVIEW_CATEGORY crc ON cr.id = crc.company_review_id
        WHERE cr.published = TRUE
        GROUP BY cr.id
        UNION ALL
        SELECT 
            review_to_company_id, 
            rate_amount AS rate
        FROM T_COMPANY_REFERENCE
        WHERE rate_amount IS NOT NULL
          AND published = true
    ) AS temp_data; -- 子查询必须添加别名,MySQL强制要求

    -- 为临时表创建索引(MySQL中需在表创建完成后执行)
    CREATE INDEX IF NOT EXISTS idx_company_reviews ON company_reviews (review_to_company_id);
end;

关键修复说明

  1. 补全索引创建语法:报错行缺少CREATE INDEX关键字,MySQL要求完整的索引创建语句格式为CREATE INDEX [IF NOT EXISTS] 索引名 ON 表名(字段);
  2. 子查询添加别名:MySQL中嵌套的子查询必须指定别名,否则会触发语法错误;
  3. 调整索引创建时机:临时表通过CREATE ... SELECT方式创建时,无法直接在语句内附加索引,需单独拆分到表创建完成后执行;
  4. 闭合临时表创建语句:原有代码未正确闭合CREATE TEMPORARY TABLE语句,导致后续逻辑解析失败。

内容的提问来源于stack exchange,提问作者waseem mir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:40:48