JDBC中INSERT ON DUPLICATE KEY UPDATE参数绑定异常求助
解决INSERT ON DUPLICATE KEY UPDATE参数缺失问题
问题根源
你的SQL语句中ON DUPLICATE KEY UPDATE部分使用了独立占位符(?),导致总共有22个参数需要绑定,但你只设置了INSERT部分的11个,因此触发参数未设置的异常。下面提供两种实用解决方案:
方案1:重复绑定参数(直接但繁琐)
直接将已设置的11个参数再次绑定到UPDATE部分对应的占位符上,补齐22个参数:
// 原有参数设置 statement.setString(1, item.ownerId) statement.setInt(2, item.objectId) statement.setInt(3, item.template.id) statement.setInt(4, item.count) statement.setInt(5, item.enchantLevel) statement.setString(6, item.itemLocation.name) statement.setInt(7, item.itemLocationData) statement.setInt(8, item.customType1) statement.setInt(9, item.customType2) statement.setInt(10, item.durationLeft) statement.setLong(11, item.createTime) // 补充UPDATE部分的参数绑定 statement.setString(12, item.ownerId) statement.setInt(13, item.objectId) statement.setInt(14, item.template.id) statement.setInt(15, item.count) statement.setInt(16, item.enchantLevel) statement.setString(17, item.itemLocation.name) statement.setInt(18, item.itemLocationData) statement.setInt(19, item.customType1) statement.setInt(20, item.customType2) statement.setInt(21, item.durationLeft) statement.setLong(22, item.createTime)
方案2:使用VALUES()函数复用插入值(推荐,简洁高效)
修改SQL语句,在ON DUPLICATE KEY UPDATE中用VALUES(column_name)直接引用INSERT部分对应列的插入值,这样只需绑定11个参数即可:
const val INSERT_OR_UPDATE_ITEM_SQL = "" + "INSERT INTO `items` (owner_id, object_id, item_id, count, enchant_level, item_location, item_location_data, custom_type1, custom_type2, duration_left, create_time)" + "VALUES (?,?,?,?,?,?,?,?,?,?,?) " + "ON DUPLICATE KEY UPDATE " + "owner_id=VALUES(owner_id), " + "object_id=VALUES(object_id), " + "item_id=VALUES(item_id), " + "count=VALUES(count), " + "enchant_level=VALUES(enchant_level), " + "item_location=VALUES(item_location), " + "item_location_data=VALUES(item_location_data), " + "custom_type1=VALUES(custom_type1), " + "custom_type2=VALUES(custom_type2), " + "duration_left=VALUES(duration_left), " + "create_time=VALUES(create_time)"
参数设置保持你原来的11项即可,无需额外修改。
关键注意事项
确保items表中存在主键或唯一约束(比如object_id或owner_id+object_id组合唯一键),否则ON DUPLICATE KEY UPDATE不会触发更新逻辑,只会执行插入操作。
内容的提问来源于stack exchange,提问作者Vetalll
相关产品推荐
相关产品推荐

