本文适用于使用 MyBatis + MySQL 开发中出现 “Column count doesn't match value count at row 1
” 报错的朋友,尤其是在批量插入或更新数据时,遇到 XML 映射文件中 insert
标签报错的问题。
一、遇到的问题:
二、错误原因分析
列数与值数量不匹配(Column count doesn't match value count at row 1)
仔细查看才知道原因:我们少写一个逗号
这两个参数之间少了一个逗号(,),SQL 拼接后会把它们拼成一个字段,导致值的数量变成 7,而你指定了 8 个字段。
#{item.itemCode} #{item.whCode},
<insert id="insertOrUpdateBatch" parameterType="java.util.List">
INSERT INTO wk_crm_fg_inven (
id, order_number, item_code, wh_code,
purchase_price, delivery_ratio, balance_value, tot_amount
)
VALUES
<foreach collection="list" item="item" separator=",">
(#{item.id}, #{item.orderNumber}, #{item.itemCode} #{item.whCode},
#{item.purchasePrice}, #{item.deliveryRatio}, #{item.balanceValue}, #{item.totAmount})
</foreach>
ON DUPLICATE KEY UPDATE
order_number = VALUES(order_number),
item_code = VALUES(item_code),
wh_code = VALUES(wh_code),
purchase_price = VALUES(purchase_price),
delivery_ratio = VALUES(delivery_ratio),
balance_value = VALUES(balance_value),
tot_amount = VALUES(tot_amount)
</insert>
三、正确写法 ✅
将问题修正为:
四、总结
-
这个错误常见于 SQL 拼接语句中,尤其是
VALUES (...)
部分; -
建议使用格式化工具或 IDEA 的 XML 格式化功能辅助检查;
-
不要忽略参数之间的逗号,哪怕是一个字段漏了逗号也会导致 SQL 整体错乱;
-
尽量提前用单条 SQL 在 Navicat / MySQL 客户端测试,确认无误再用于批量插入。