重复密钥更新时的MySQL PreparedStatement

时间:2013-05-12 15:43:16

标签: java mysql

以下代码不会产生任何错误,但它似乎也没有做任何事情。

我正在尝试将玩家的统计数据保存到数据库中,如果他/她已经在那里则更新它们。表'playerstats'有列[姓名,杀戮,死亡,治疗,上限,条纹,mvps]。 'name'是主键。

执行后,表格保持不变,就像没有发生任何事情一样。我做错了什么?

for (String pName : pNames) {

    PlayerStats pStats = getStats(pName);

    PreparedStatement pstmt = null;
    String updateString = "INSERT INTO darkagedb.playerstats VALUES (?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE name = ?, kills = kills + ?, deaths = deaths + ?, heals = heals + ?, caps = caps + ?, streak = GREATEST(streak,?), mvps = mvps + ?";

    try {
        conn.setAutoCommit(false);

        pstmt = conn.prepareStatement(updateString);
        pstmt.setString(1, pStats.name);
        pstmt.setInt(2, pStats.kills);
        pstmt.setInt(3, pStats.deaths);
        pstmt.setInt(4, pStats.heals);
        pstmt.setInt(5, pStats.caps);
        pstmt.setInt(6, pStats.streak);
        pstmt.setInt(7, pStats.mvps);
        pstmt.setString(8, pStats.name);
        pstmt.setInt(9, pStats.kills);
        pstmt.setInt(10, pStats.deaths);
        pstmt.setInt(11, pStats.heals);
        pstmt.setInt(12, pStats.caps);
        pstmt.setInt(13, pStats.streak);
        pstmt.setInt(14, pStats.mvps);
        conn.commit();
        System.out.println("saved stats for " + pStats.name);
        saved++;

    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
        if (pstmt != null)
            pstmt.close();
        conn.setAutoCommit(true);
        } catch (SQLException e) {
        e.printStackTrace();
    }
}


    }

1 个答案:

答案 0 :(得分:1)

    pstmt.setInt(14, pStats.mvps);
    pstmt.executeUpdate(); // You have to add this line
    conn.commit();

目前,您还没有告诉准备好的声明做任何事情。必须执行才能获得任何结果。