2017-07-02 76 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