2010-12-07 112 views
1

我有一些要導入的記錄。他們第一次插入時沒關係。如果我嘗試再次導入相同的數據,我收到一個org.postgresql.util.PSQLException:錯誤:重複鍵值違反了唯一性約束。如果數據相同/或更改,如何更新數據庫中的記錄,如果是使用JDBC的新數據,如何插入?使用JDBC插入或更新表格

public void store(Object entity) throws Exception { 
    try { 
     if (this.updateEntity((XEntity) entity) == 0) { 
      this.insertEntity((XEntity) entity); 
     } 

     ... 

    } catch (SQLException sqlEx) { 
     ... 
    } 
} 

private int updateEntity(XEntity entity) throws SQLException { 
    PreparedStatement prepStmt = this.getUpdatePreparedStmt(); 
    ... 
    return prepStmt.executeUpdate(); 
} 

private void insertEntity(XEntity entity) throws SQLException { 
    ... 
    this.getInsertPreparedStmt().executeUpdate(); 
} 

現在問題得到修復。我在下面提供了一個答案。

+0

什麼是XEntity? – 2010-12-07 07:51:56

+1

您似乎處於實施的相當早期階段。你有沒有考慮使用JPA或Hibernate來處理持久性?是否有任何需要低級別JDBC訪問的特定要求? – 2010-12-07 07:56:13

+0

你應該想出爲什麼「this.updateEntity((XEntity)entity)== 0」。 – pinichi 2010-12-07 08:00:48

回答

0

該測試邏輯有效。

if (this.updateEntity((XEntity) entity) == 0) { 
    this.insertEntity((XEntity) entity); 
} 

問題在於更新記錄的方法。更新準備語句中的WHERE子句使用了不同的數據(包含空格的數據),因此updateEntity將始終返回0.這就是爲什麼只有插入而不是更新的原因。非常感謝您的幫助。

1

您可以嘗試使用Postgres的SQL「合併」或「替換」

0

您可以通過UPDATE命令通過JDBC字符串。根據this SO帖子,您將不得不編寫2條語句。

0

如果您想使用相同的方法來插入和更新數據,您需要先檢查數據是否存在。用於插入新對象的SQL命令是INSERT,而用於更新元素的SQL命令是UPDATE。所以,你可以做的是做一個SELECT來檢查你的數據是否已經在這裏,然後根據結果做一個INSERTUPDATE

但是,這是一種解決方法。你真的需要澄清你的實現,並且不管你是添加還是更新數據,都要製作不同的方法。在商業方面,這顯然是兩種截然不同的功能,所以在我看來,一種方法似乎就是設計問題。