我有以下代码:
for (Buddy buddy : buddyList.getBuddies())
{
int friendId = Integer.parseInt(buddyId); //this is valid btw always
preparedStatement = connect.prepareStatement("insert into members_friends "
+ "(id_memb_friend1, id_memb_friend2, active) values (?, ?, ?) "
+ "on duplicate key update id_memb_friend1 = values(id_memb_friend1), "
+ "id_memb_friend2 = values(id_memb_friend2), "
+ "id = LAST_INSERT_ID(id)");
// parameters start with 1
preparedStatement.setInt(1, Math.min(userId,friendId)); //sort it a bit
preparedStatement.setInt(2, Math.max(userId,friendId));
preparedStatement.setInt(3, 1); //active friendship
}
try{
//run prepared statement and add all them to database
int returnValue = preparedStatement.executeUpdate();
}
catch(Exception e){
//I print exception here to file
}
这里会发生的事情是没有触发异常,但数据库中没有任何变化(例如,没有添加新伙伴,没有任何变化)。并且returnValue = 1 如果我只使用插入而没有重复密钥更新,我将收到一个错误,该密钥已存在于数据库中。
我的表,如果metters有以下索引/键:
index:unique_friend_index
定义: 类型 BTREE 独特 是 列 id_memb_friend1 id_memb_friend2
索引:PRIMARY
定义: 类型 BTREE 独特 是 列 ID
索引:id_memb_friend1
定义: 类型 BTREE 独特 没有 列 id_memb_friend1
索引:id_memb_friend2
定义: 类型 BTREE 独特 没有 列 id_memb_friend2
我确实需要在检测到重复键后继续执行并添加新好友。这就是我需要的一切。我得到的列表最多可以有100条记录,理论上只有很少的新伙伴(所以我需要跳过所有其他的(避免再次检查db,他们已经是朋友了))