2017-07-02 74 views
2

我正在創建包裹機器程序。每個宗地都有獨特的parcelID,它被導出到mysql數據庫。問題是每次運行程序時,程序都從0開始計數parcelID。我正在尋找一個解決方案,它將允許我檢查數據庫中最後一個parcelID並在最後一個之後創建行。INSERT INTO獨特的字段

現在看起來像這樣:1.我正在通過java程序在db(成功)中創建一個新行。我在一段時間後關閉了程序。 3.我再次運行該程序,因爲「PRIMARY」關鍵字出現錯誤「重複條目1」,所以我無法添加另一個新行。

public static void post() throws Exception{ 

    int parcelID = Parcel.generateID(); 
    int clientMPNumber = Parcel.typeClientNumber(); 
    int orderPassword = Parcel.generatePass(); 

    try{ 
     Connection con = getConnection(); 
     PreparedStatement posted = con.prepareStatement("INSERT INTO Parcels.Orders (parcelID, clientMPNumber, orderPassword) VALUES ('"+parcelID+"', '"+clientMPNumber+"', '"+orderPassword+"')"); 

     posted.executeUpdate(); 
    } 
    catch(Exception e){ 
     System.out.println(e); 
    } 
    finally{ 
     System.out.println("Insert completed"); 
    } 
} 

和方法是:

public static int generateID(){ 
    parcelID = parcelID + 1; 
    return parcelID; 
} 
+3

btw .:不要在你的查詢中使用'prepareStatement()'和字符串concat值。使用'prepareStatement()'構建「準備好的語句」(這是一個帶「?」的查詢作爲值的佔位符),並使用'setInt'和'setString'來填充這些佔位符。 – Progman

回答

1

我讓數據庫爲你做繁重的任務 - 只要定義parcelIDserial,而不是試圖自己將其值設置。

1

你不應該使用ID生成,只是在創建數據庫表AUTO_INCREMENT列

1

如上所述here,定義主鍵列自動增量爲每個插入使你的Java代碼沒有手動計算主鍵值每次。

如果這不可能,您需要顯示如何聲明&初始化parcelID。從當前代碼開始,parcelID看起來是一個類級別的字段,每次運行都會初始化爲零,因此您始終可以獲得相同的值 - 1。您需要使用數據庫中的最後一個值進行初始化。

此外,在評論中提及到您的有關問題落實建議PreparedStatement

1

有幾件事情來衡量某人來。

// parcelID should be an INT AUTOINCREMENT primary key. 
    try (PreparedStatement posted = con.prepareStatement(
      "INSERT INTO Parcels.Orders (clientMPNumber, orderPassword) " 
      + "VALUES (?, ?)", 
      Statement.RETURN_GENERATED_KEYS); 
     posted.setString(1, clientMPNumber); 
     posted.setString(2, orderPassword); 
     posted.executeUpdate(); 
     try (ResultSet rsKey = posted.getGeneratedKeys()) { 
      if (rsKey.next()) { 
       int parcelID = rsKey.getInt(1); 
       return parcelID; // Or such 
      }try-with-resources 
     } 
    } 

數據庫可以處理自動編號最好的,使在同一時間兩筆交易不偷相同的「下一個」號碼。

你應該關閉像Connection,PreparedStatement和ResultSet的東西。這可以最好的使用嘗試與資源有點尷尬的語法。即使在例外和退貨時也會自動關閉。

PreparedStatements應與佔位符?一起使用。這需要注意在密碼中轉義特殊字符如'。還可以防止SQL注入

文體更好地使用上面的SQLException異常。更好,甚至可以是throws SQLException