2016-02-18 32 views
1

我在下面如果insert語句也給

List<String> script=new ArrayList<String>; 
script.add("INSERT INTO PUBLIC.EMPLOYEE(ID, NAME) VALUES (1, 'Madhava')); 
script.add(INSERT INTO PUBLIC.EMPLOYEE(ID, NAME) VALUES (2, 'Rao')); 
script.add(INSERT INTO PUBLIC.ADDRESS(ID, CITY) VALUES(1, 'Bangalore')) 
script.add(INSERT INTO PUBLIC.ADDRESS(ID, CITY) VALUES(2, 'Hyd')); 

我創建的存儲一堆的INSERT語句中ArrayList.like重複鍵異常(行ID = 1的表中找到)如何更新JDBC(PostgreSQL系統)的聲明連接到使用PostgreSQL JDBC我得到執行使用循環statments像下面

try{ 
     Connection con=DBConnections.getPostgresConnection(); 
     Statment statment=con.createStatment(); 
     for(String query:script){ 
      executeUpdate(query); 
     } 
    }catch(Exception e){ 
    e.printStackTrace(); 
    } 

,如果我得到的重複鍵異常(ieAlready記錄存在postgresDB)。

org.postgresql.util.PSQLException: ERROR: duplicate key value 
    violates unique constraint "reports_uniqueness_index" 

如何使用更新查詢更新Postgres中的相同記錄(記錄)。 有什麼辦法可以解決這個問題嗎? 有沒有其他更好的方法來解決這個問題? 能否請您解釋...

+2

你可以使用'插上衝突...' –

+1

的方式來解決這將是要麼更新,如果存在密鑰或使用自動生成的密鑰。 – duffymo

+1

不要以爲你應該有一個INSERT列表;最好有一個傳遞給PreparedStatement並對數據庫執行的對象列表。 – duffymo

回答

0

執行更新將DML語句發送到數據庫。您的數據庫必須已經有一條記錄,該記錄使用僱員或地址表中的一個主鍵。

你必須確保你不違反主鍵約束。違反約束會導致例外。

將您的查詢更改爲更新語句或刪除導致衝突的記錄。

0

無法獲取導致異常的密鑰(儘管您可能可以解析錯誤消息,但肯定不推薦)。

相反,你應該嘗試防止這種情況發生。至少有三種簡單的方法來完成這一點。

  1. 使數據庫更新列

    (in Postgresql you should use a serial type (which is basically an int data type) 
    CREATE TABLE employee 
    (
    id serial NOT NULL, 
    --other columns here) 
    

你的插入會是這個樣子

script.add("INSERT INTO PUBLIC.EMPLOYEE(NAME) VALUES ('Madhava'));//no ID here 
  • 創建序列讓你的JDBC代碼調用順序'nexval方法。

    script.add("INSERT INTO PUBLIC.EMPLOYEE(ID, NAME) VALUES (YOUR_SEQ_NAME.NEXTVAL(), 'Madhava')); 
    
  • 在Java中創建一個唯一的ID(至少推薦)

    script.add("INSERT INTO PUBLIC.EMPLOYEE(ID, NAME) VALUES (UUID.random(), 'Madhava'));//or Math.random() etc