1

我的程序有一个自动递增的 ID,其格式为ITM001, ITM002.... 但是在ITM009, ITM0010序列被破坏并回到ITM001. 因此,我将获得ITM0010下一个项目 ID 而不是ITM0011. 请帮助我了解我应该如何编写查询以继续序列。

ITM001
**ITM0010**
ITM002
ITM003
ITM004
ITM005
ITM006
ITM007
ITM008
ITM009
   Connection conn = DBConnection.conn();
      String sql = "select itemId from ItemMain";
       ResultSet res = DBHandller.getData(sql, conn);
        if (res.last()) {
              String lastid = res.getString("itemId");
               return lastid;
        }
        return null;   
/////////////////////////////////////////////////////////////////////////////


              String itemID = ItemController.getItemID();

              String[] split = itemID.split("ITM",0);
              int num = Integer.parseInt(split[1]);
              itemID = "ITM00"+ (num+1);
              txtitemID.setText(itemID);
4

2 回答 2

1

问题是您split在 0 上使用,并且在您递增之后,您的字符串中有几个 0,例如:

    String[] split = itemID.split("ITM",0);
    int num = Integer.parseInt(split[1]);
    String second = "ITM00" + (num + 1);
    System.out.println(second);
    System.out.println(Arrays.toString(second.split("0")));

这将输出:

[ITM, , 1]

由于最后的 0 也会被拆分。

就像是:

String itemID = "ITM009";
int num = Integer.parseInt(itemID.substring(itemID.indexOf("0")));
String second = "ITM0" + String.format("%02d", num + 1);
System.out.println(second);

可能会给你你想要的东西,但你需要弄清楚你希望你的密钥有多少位数并相应地进行调整。

于 2013-04-01T15:13:49.210 回答
0

您正在对 VARCHAR 字段进行隐式排序。

SELECT a.a FROM (
    SELECT 'a001' [a]
    UNION ALL
    SELECT 'a009' [a]
    UNION ALL
    SELECT 'a0010' [a]
) a ORDER BY a

a001
a0010
a009

您获取的最后一个 id 将始终是 009,因此您创建的下一个 id 将始终是 0010。

如果您在前面用 1 个“0”而不是两个填充“10”,则隐式升序排序将是正确的。“001 ... 009, 010”

于 2013-04-01T15:28:39.100 回答