You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL更新语句列索引越界异常排查求助

解决PostgreSQL更新操作中的列索引越界异常

问题根源

你的代码中SQL语句存在两处关键语法错误,导致PreparedStatement识别的占位符数量与你设置的参数数量不匹配,从而抛出org.postgresql.util.PSQLException: The column index is out of range: 5, number of columns: 4异常:

  1. 缺失赋值逻辑与空格:client_email字段未编写= ?的赋值语句,丢失了对应占位符;同时该字段与WHERE关键字之间缺少空格,会触发SQL语法错误。
  2. 拼接空格遗漏:UPDATE clients与SET之间没有空格,拼接后会形成非法的UPDATE clientsSET语句。

修正后的代码

public Client updateClient (int clientId, AddUpdateDTO client) throws SQLException {
    try (Connection con = JDBCUtility.getConnection()){
        String sql = "UPDATE clients "
                + "SET client_first_name = ?, "
                + "client_last_name = ?, "
                + "client_phone_number = ?, "
                + "client_email = ? "
                + "WHERE client_id = ?;";            
        PreparedStatement pst = con.prepareStatement(sql);
        
        pst.setString(1, client.getFirstName());
        pst.setString(2, client.getLastName());
        pst.setString(3, client.getPhoneNumber());
        pst.setString(4, client.getEmail());
        pst.setInt(5, clientId);
        
        int updatedAmount = pst.executeUpdate();
        
        if (updatedAmount != 1) {
            throw new SQLException("Unable to find client record with Id of " + clientId);
        }
    }
    
    return new Client(clientId, client.getFirstName(), client.getLastName(), client.getPhoneNumber(), client.getEmail());       
}

修正说明

  • 给UPDATE clients末尾添加空格,确保SET关键字能被数据库正确识别;
  • 补充client_email = ?的赋值逻辑,添加对应占位符,并在该语句末尾加空格,保证与WHERE关键字分隔;
  • 修正后的SQL包含5个占位符,与代码中设置的5个参数完全对应,彻底解决索引越界问题。

内容的提问来源于stack exchange,提问作者Willie Conaway

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:05:24