我在SO上检查了类似的答案,他们大多建议使用结果集来检查数据库中是否已存在该条目。不知道我在这里做错了什么
public void setMonitorData(String name, monitorData data){
Statement stmt = null;
PreparedStatement stmtInsert;
PreparedStatement stmtUpdate;
ResultSet rs = null;
for(int i = 0; i<data.wiredVector.size(); i++){
if(data.wiredVector.elementAt(i).getInterfaceName().equals(name)){
try{
String checkRecord = "SELECT * FROM list_A WHERE NAME = '" + name + "'";
stmt = conn.createStatement();
rs = stmt.executeQuery(checkRecord);
if(!rs.next()){
String insertData = "INSERT INTO list_A (NAME, mac_add, ip_add, default_gateway,"
+ " net_add, mask, broad_add, max_transfer_rate, curr_transfer_rate,"
+ " curr_used_bandwidth, packet_error_rate )"
+ "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
//preparedStatemend code here....
else{
String update = "UPDATE list_A SET ..."
.....
}
我执行代码后...在数据库中有一些dublicate记录,好像它完全跳过了这个条件
答案 0 :(得分:1)
这里你把“if(!rs.next())”移到过去的记录。 所以这里它将从之前的一行开始,这就是它可以允许重复值的原因。
答案 1 :(得分:0)
如果mac_add在表中有唯一索引或者它是主键,则可以使用INSERT .. ON DUPLICATE KEY UPDATE。
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
答案 2 :(得分:0)
你的问题在这里
if(!rs.next())
javadocs :: ResultSet.next()返回: 如果新的当前行有效,则为true;如果没有更多行,则为false
将其更改为
if(rs.next())