Moodle 4.2.1创建测验题时出现Subquery返回多行错误求助
Moodle 4.2.1 创建测验时数据库读取错误解决指南
问题详情
使用Moodle 4.2.1版本创建测验题目时触发数据库读取错误,核心报错为Subquery returns more than 1 row,完整错误追踪信息如下:
Error reading from database More information about this error Debug info: Subquery returns more than 1 row SELECT allversions.id AS versionid, allversions.version, allversions.questionid FROM mdlyo question_versions allversions WHERE allversions.questionbankentryid = ( SELECT givenversion.questionbankentryid FROM mdlyo question_versions givenversion WHERE givenversion questionid = ? ) AND allversions.status <> ? ORDER BY allversions version DESC [array ( 0 => 1298, 1 => 'draft', )] Error code: dmlreadexception Stack trace: ⚫ line 494 of /lib/dml/moodle_database.php: dml_read_exception thrown ⚫ line 293 of /lib/dml/moodle_read_slave_trait.php: call to moodle_database->query_end() ⚫ line 1278 of /lib/dml/mysqli_native_moodle_database.php: call to mysqli_native_moodle_database->query_end() ⚫ line 64 of /mod/quiz/classes/question/bank/qbank_helper.php: call to mysqli_native_moodle_database->get_records_sql() ⚫ line 699 of /mod/quiz/classes/structure.php: call to mod_quiz\question\bank\qbank_helper::get_version_options() ⚫ line 770 of /mod/quiz/classes/output/edit_renderer.php: call to mod_quiz\structure->get_version_choices_for_slot() ⚫ line 547 of /mod/quiz/classes/output/edit_renderer.php: call to mod_quiz\output\edit_renderer->question() ⚫ line 520 of /mod/quiz/classes/output/edit_renderer.php: call to mod_quiz\output\edit_renderer->question_row() ⚫ line 95 of /mod/quiz/classes/output/edit_renderer.php: call to mod_quiz\output\edit_renderer->questions_in_section() ⚫ line 210 of /mod/quiz/edit.php: call to mod_quiz\output\edit_renderer->edit_page()
错误截图:
触发原因
从报错SQL逻辑来看,主查询用=匹配子查询返回的questionbankentryid,但子查询针对questionid=1298返回了多条不同的题库条目ID,导致SQL语法冲突。常见诱因包括:
- 题目版本数据异常,同一题目被重复关联到不同题库条目
- 数据库迁移、同步过程中产生数据冗余
- 第三方题库插件操作破坏了数据一致性
解决方案
临时修复步骤
- 登录Moodle数据库管理工具(如phpMyAdmin)
- 执行SQL定位异常数据:
SELECT questionid, questionbankentryid, status, id FROM mdlyo_question_versions WHERE questionid = 1298 ORDER BY id DESC;
- 保留最新的有效记录(通常为非draft状态),删除冗余关联记录(操作前务必备份数据库):
-- 示例:保留ID最大的记录,删除其余 DELETE FROM mdlyo_question_versions WHERE questionid = 1298 AND id NOT IN ( SELECT MAX(id) FROM mdlyo_question_versions WHERE questionid = 1298 );
长期优化建议
- 升级到Moodle 4.2.x系列最新补丁版本,官方可能已修复此类数据一致性问题
- 避免直接修改数据库表,所有题目操作通过Moodle后台完成
- 定期运行Moodle内置数据库检查工具(路径:站点管理 -> 服务器 -> 数据库 -> 检查数据库),及时排查数据异常
内容的提问来源于stack exchange,提问作者Zain
相关产品推荐
相关产品推荐

