Kis*_*ine 3 java mysql prepared-statement sql-update on-duplicate-key
这是我想要做的.如果主键(entity_id)存在,我想插入此表或更新记录.我只是遇到了SQL语法的问题.它不会让我有比第一个'VALUES'更多的参数,所以我得到以下错误:
参数索引超出范围(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]});
Run Code Online (Sandbox Code Playgroud)
这有点像我想的那样,但我不能解释它的需要.很抱歉可能会发布重复内容.
哦,这是我的代码中的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;
}
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助.:)
sac*_*tiw 18
为什么不直接将绑定参数放在跟随查询的重复值本身中:
INSERT INTO mytable (col1, col2, col3) VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE col1=?, col2=?, col3=?;
Run Code Online (Sandbox Code Playgroud)
可以重写为:
INSERT INTO mytable (col1, col2, col3) VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE col1=VALUES(col1), col2=VALUES(col2), col3=VALUES(col3);
Run Code Online (Sandbox Code Playgroud)
IMO应该优先于第2名,因为:
在查询中不使用绑定参数'ON DUPLICATE KEY UPDATE'部分意味着您不必编写额外的代码片段(或在您的情况下迭代)来绑定它们
编写更少的代码意味着更少发生绑定错误的机会(错别字等)
它具有更好的可读性
在 a 的上下文中PreparedStatement,该字符?是一个绑定参数,稍后将被某个值替换(使用设置器)。如果在引号内使用它,则该语句将其视为文字,而不是被替换。您的查询的这一部分:
"`wai_type`='(?)', `wai_id`='(?)', `character_id`='(?)', `looted`='(?)'",
Run Code Online (Sandbox Code Playgroud)
设置wai_type为(?),这不是您想要的。去掉单引号。`实际上,也摆脱角色。
| 归档时间: |
|
| 查看次数: |
7846 次 |
| 最近记录: |