You need to enable JavaScript to run this app. Ubuntu下MySQL不识别WITH语句报SQL语法错误1064如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下MySQL不识别WITH语句报SQL语法错误1064如何解决

问题排查与解决方案

1. 最常见原因:MySQL版本不支持CTE语法

WITH 子句(通用表表达式/CTE)是 MySQL 8.0 版本才正式支持的特性,低于该版本的MySQL无法识别WITH语法,会直接抛出1064语法错误。

  • 版本验证方法:在MySQL命令行执行 SELECT VERSION(); 即可查看当前数据库版本。
  • 低版本兼容方案:将CTE改写为派生表子查询,效果完全一致,兼容所有MySQL5.x版本,改写后的代码同时优化了参数绑定逻辑,避免SQL注入风险:
DB::select(DB::raw("
    SELECT * FROM (
        SELECT tbl_etudiants.*, tbl_cours.idCours, tbl_formations.idFormation as formationID
        FROM dependance_groupes
        INNER JOIN tbl_etudiants ON tbl_etudiants.idStudent = dependance_groupes.studentID
        INNER JOIN tbl_cours ON tbl_cours.groupID = dependance_groupes.groupID
        INNER JOIN tbl_formations ON tbl_formations.idFormation = tbl_cours.formationID
    ) AS liststudentsoff
    LEFT JOIN tbl_absences ON liststudentsoff.idStudent = tbl_absences.studentID AND liststudentsoff.idCours = tbl_absences.coursID
    WHERE liststudentsoff.idCours = ? AND liststudentsoff.formationID = ?
"), [$request->idCours, $cours->formationID]);

注意:原SQL的CTE查询未选择tbl_formations.idFormation字段,后续WHERE条件直接引用liststudentsoff.formationID会触发字段不存在错误,上述代码已经补充了该字段的查询。

2. MySQL版本≥8.0时的排查点

如果确认数据库版本支持CTE,可检查以下两点:

  • 检查当前数据库账号是否具备执行CTE的对应权限,报错信息中的access violation提示可能由权限不足导致
  • 检查Laravel配置文件config/database.php中MySQL连接的modes配置项,确认没有禁用CTE的相关SQL模式设置。

内容的提问来源于stack exchange,提问作者Amaury Schmitt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 06:15:03