6

这是我想要做的。如果主键(entity_id)存在,我想插入该表或更新记录。我只是遇到了 SQL 语法的问题。它不会让我拥有比第一个“值”数量更多的参数,所以我收到以下错误:

参数索引超出范围(7 > 参数数量,即 6)。

int insertOrUpdateSuccess = MyDBSyncher.UPDATE("INSERT INTO " + DB_NAME + ".entities " +
    "(`entity_id`, `wai_type`, `wai_id`, `character_id`, `looted`, `creation_time`) " +
    "VALUES ((?), (?), (?), (?), (?), (?)) " +
    "ON DUPLICATE KEY UPDATE " +
    "`wai_type`='(?)', `wai_id`='(?)', `character_id`='(?)', `looted`='(?)'", 
    new String[]{tmpEntityId, values[0], values[1], values[2], values[3], values[4],
    values[0], values[1], values[2], values[3]});

我认为这与我所要求的有点相似,但我无法根据我的需要对其进行解释。很抱歉可能发布重复。

哦,这是我的代码中的 UPDATE() 函数:

public static int UPDATE(String updateStatement, String[] params){
    try {
        if(!conn.isClosed()) {
            logger.trace("Successfully connected to MySQL server using TCP/IP - " + conn);

            stat = conn.prepareStatement(updateStatement);
            for (int i = 0; i < params.length; i++){
                stat.setString(i+1, params[i]);
            }
            return stat.executeUpdate();
        }
    } catch(SQLException eSQL) {
        logger.fatal(eSQL.getMessage());
    }
    return -1;
}

感谢您对此的任何帮助。:)

4

2 回答 2

27

为什么不只是摆脱将绑定参数放在跟随查询的重复值本身中:

INSERT INTO mytable (col1, col2, col3) VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE col1=?, col2=?, col3=?;

可以重写为:

INSERT INTO mytable (col1, col2, col3) VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE col1=VALUES(col1), col2=VALUES(col2), col3=VALUES(col3);

IMO 应该更喜欢第 2 次而不是第 1 次,因为:

  • 不使用查询中“ON DUPLICATE KEY UPDATE”部分的绑定参数意味着您不必编写额外的代码(或在您的情况下进行迭代)来绑定它们

  • 编写更少的代码意味着发生绑定错误(错别字等)的机会更少

  • 它具有更好的可读性

于 2014-03-27T06:05:00.963 回答
5

在 a 的上下文中PreparedStatement,字符?是一个绑定参数,稍后将被某个值替换(使用 setter)。如果您在引号中使用它,则该语句将其视为文字,而不是被替换。您查询的这一部分:

"`wai_type`='(?)', `wai_id`='(?)', `character_id`='(?)', `looted`='(?)'", 

设置wai_type(?),这不是您想要的。摆脱单引号。实际上,也可以摆脱`角色。

于 2013-04-02T20:23:46.193 回答