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
相关产品推荐
相关产品推荐

