MySQL从多表查询插入数据报1136列数不匹配错误求解
MySQL 1136错误排查与解决
错误原因定位
Error Code: 1136. Column count doesn't match value count at row 1属于插入语句字段数和传入值数量不匹配的典型报错,本次出错核心是语法误用:
- 你使用了
INSERT ... VALUES()的单条/批量值插入语法,但内部嵌套了返回多行结果的SELECT查询,MySQL会把整个SELECT的返回结果识别为单个值,和user_login_history表后指定的9个字段数量不匹配,触发报错。 - 多余的括号包裹SELECT语句,进一步加剧了语法解析错误。
排查步骤
- 先确认插入目标表指定的字段数量:你这里明确指定了
created_at、updated_at、created_by、updated_by、USER_ID、TENANT、LAST_LOGIN、deleted、published共9个字段,需要对应传入每行9个字段的结果集。 - 核对值传入的语法规则:如果是从查询结果批量插入数据,不需要加
VALUES关键字,直接使用INSERT INTO ... SELECT ...语法即可。 - 单独执行内部的SELECT语句,确认返回的字段数、字段类型和目标表要求的9个字段完全匹配,避免字段多写/漏写。
修复后的SQL语句
INSERT IGNORE INTO user_login_history (`created_at`,`updated_at`,`created_by`, `updated_by`,`USER_ID`,`TENANT`, `LAST_LOGIN`,`deleted`,`published`) SELECT a.created_at, a.updated_at, a.created_by, a.updated_by, user.id, a.tenant, a.created_at, b'0', b'1' FROM (SELECT audit_log_summary.* FROM audit_log_summary, (SELECT user, MAX(created_at) AS created_at, tenant FROM audit_log_summary WHERE audit_log_summary.REVISION_TYPE = 'LOGGED_IN' GROUP BY user , TENANT) max_user WHERE audit_log_summary.user = max_user.user AND audit_log_summary.tenant = max_user.tenant AND audit_log_summary.created_at = max_user.created_at) a INNER JOIN user ON a.user = user.email;
验证方法
- 先单独执行修复语句中的SELECT部分,确认返回的字段数量、字段类型和目标表要求完全匹配。
- 可以先加
LIMIT 10限制执行少量插入验证,确认没有报错后再全量执行。
可选语法优化
原SQL内层使用逗号隐式连接表,可以换成显式INNER JOIN写法,可读性更强:
-- 内层查询优化示例 SELECT audit_log_summary.* FROM audit_log_summary INNER JOIN ( SELECT user, MAX(created_at) AS created_at, tenant FROM audit_log_summary WHERE REVISION_TYPE = 'LOGGED_IN' GROUP BY user, TENANT ) max_user ON audit_log_summary.user = max_user.user AND audit_log_summary.tenant = max_user.tenant AND audit_log_summary.created_at = max_user.created_at
内容的提问来源于stack exchange,提问作者Hemant singh
相关产品推荐
相关产品推荐

