2013-02-15 31 views
0

我手動增加我的ID號碼在我的數據庫,因爲我無法讓它自動工作。這是一個項目,不關心它是否自動工作 - 我可以嘗試並在以後解決。如何從Java代碼創建數據庫ID?

我正在創建一個方法,檢查結果集中最低的空閒ID號。最低值將被設置爲一個名爲availableId的整數,這些用戶在註冊時將被給予。

這是我迄今從閱讀了:

http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html http://wiki.netbeans.org/GetStartedwithJavaDB

作爲一個例子,這是我在我的數據庫ID:

/,2,/,4,5,6,/,8,9 

1,3和7因爲這些用戶刪除了他們的帳戶而丟失。我想在填寫任何其他人之前填寫第一個數字,然後下一個用戶將註冊爲第三個數字。

public int getAvailableId() { 
    int availableId = 1; 
    try { 
     String stmt = "select PID from APP.PERSON"; 
     PreparedStatement ps = Main.getPreparedStatement(stmt); 
     ResultSet rs = ps.executeQuery(); 
     while (rs.next()) { 
      int n = rs.getInt(1); 
      int n2 = rs.next().getInt(1); 

      if (!(n == 1)) { 
       return availableId; 
      } else if (!(n2-- == n)) { 
       availableId = n++; 
      } 
     } 
     rs.close(); 
     ps.close(); 
    } catch (Exception e) { 
     System.out.println(e); 
    } 
    return availableId; 
} 

兩個問題在這裏:

  1. rs.next()返回一個布爾值,但我想N2舉行下一行的整數值 - 我無法找到,這是否從這裏的方法 - http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html
  2. 我無法弄清楚如何遍歷所有內容以找到最低可能的空閒ID號。

請原諒垃圾代碼!隨着我的進展,我學到了很多東西,我明白這對一兩個代碼來說是不好的做法,代碼並不好。

我該如何去做這件事?

+0

如果」真的要做到這一點,確保使用事務來避免雙重ID(想象兩個程序同時查找下一個ID,然後使用相同的ID)。無論如何,這是非常糟糕的做法,並且在我能想到的所有RDBMS中自動遞增ID很容易,可以更好地解決這個問題(並且可能會問一個關於它的問題),現在和維護您的軟件時可以節省很多麻煩。 – 2013-02-15 15:53:41

+1

此外,請注意,「從APP.PERSON選擇PID」不能保證和訂購。如果必須,請使用:「從APP.PERSON ORDER BY PID中選擇PID」。 大部分情況下,我發現試圖重複使用已刪除的ID是一個壞主意。只要獲得最大值並完成。 – 2013-02-15 15:56:32

+0

感謝您編輯延斯埃拉特,我想不起一個標題,所以寫了,忘了提交之前完成它。感謝您的迴應。 – 2013-02-15 15:57:03

回答

1

你的代碼有點不對。這需要改變:

rs.next().getInt(1); 

要剛:

rs.getInt("PID"); 

rs.next()做兩件事情。如果存在下一行,則返回true,然後將結果集光標移動到指向下一行。

當沒有下一行時,它將返回false並因此打破循環。

當您調用getInt時,它將嘗試從當前行中檢索int。正如你所看到的,循環條件中的rs.next()會每次將它移動到下一行。


此外,在這種情況下,你需要聲明

int n外循環。

然後在每次循環迭代結束時分配n = n2

事情是這樣的:

int n = 0; 
    while (rs.next()) { 

     int n2 = rs.getInt(1); 

     if (!(n == 1)) { 
      return availableId; 
     } else if (!(n2-- == n)) { 
      availableId = n++; 
     } 

     n = n2; 
    } 

您可能需要發揮與它周圍,以得到它做你想要什麼。


我最後的意見,不要打擾試圖獲得儘可能低的無身份證號碼,只是從數據庫中獲取)次數最多的usign一個SQL MAX(或東西,然後再加1

相關問題