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;
关键修复说明
- 补全索引创建语法:报错行缺少
CREATE INDEX关键字,MySQL要求完整的索引创建语句格式为CREATE INDEX [IF NOT EXISTS] 索引名 ON 表名(字段); - 子查询添加别名:MySQL中嵌套的子查询必须指定别名,否则会触发语法错误;
- 调整索引创建时机:临时表通过
CREATE ... SELECT方式创建时,无法直接在语句内附加索引,需单独拆分到表创建完成后执行; - 闭合临时表创建语句:原有代码未正确闭合
CREATE TEMPORARY TABLE语句,导致后续逻辑解析失败。
内容的提问来源于stack exchange,提问作者waseem mir
相关产品推荐
相关产品推荐

