【问题标题】:Auto generate ID in java在java中自动生成ID
【发布时间】:2013-07-01 10:47:45
【问题描述】:

我正在使用 JSP + ServletsOracle10 作为后端 开发一个 Web 应用程序。 p>

我有一个用于存储客户相关信息的表:

|ID        |Name            |City          |
|N0001     |ABC             |NASIK         |
|N0002     |PQR             |NASIK         |
|N....     |...             |NASIK         |
|N9999     |XYZ             |NASIK         |
|N10000    |LMN             |NASIK         |
|N10001    |MNO             |NASIK         |

上表中ID是一个主键,它是根据City自动生成的(City的第一个字符+数字(数字必须至少4个字符长,所以对于第一个ID,三个前导零将被添加到数字))

For Generating ID:
我正在使用以下查询从表中获取最大 ID,然后使用一些 java 代码自动生成下一个 ID

query = "select ID from CUST where CITY='NASIK' order by ID desc";

然后从ResultSet 获取第一个ID,这与预期的一样,直到ID 达到N9999,但是当IDN10000 或更高时,查询将N9999 作为最大@ 987654334@.

N9999之后的输出:

ID
----------
N9999
N10001
N10000
N0002
N0001

预期输出

ID
----------
N10001
N10000
N9999
N0002
N0001

所以我的问题是上面的查询有什么问题吗?或者有没有更好的方法来自动生成包含字符串的 ID。

编辑1 我的要求是自动生成ID,它将在起始位置包含字符。

【问题讨论】:

  • 从 CUST 中选择 ID,其中 CITY='NASIK' order by substr(ID,2) desc

标签: java oracle auto-generate


【解决方案1】:

使用这个查询

select ID from CUST where CITY='NASIK' order by to_number(substr(ID,2)) desc;

【讨论】:

    【解决方案2】:

    由于 ID 是字符串而不是数字,因此它的排序方式不同。如果你做了类似的事情,它会按照你的意愿排序:

    0001N
    0002N
    ...
    

    或者只存储数字,而不是字符串

    【讨论】:

    • 感谢您的回答,但我的要求是自动生成在起始位置包含字符的 ID。
    • 我明白了,那么您必须使用 substr 并确定(可能无法很好地扩展)要跳过多少个字符
    【解决方案3】:

    使用 INSERT,无需插入主键 ID,即可获取“生成的密钥”。

    String sql = "INSERT INTO Customers(Name, City) VALUES (?, ?)";
    PreparedStatement stmt = conn.prepareStatement(sql,
         PreparedStatement.RETURN_GENERATED_KEYS);
    stmt.setString(1, ...);
    stmt.setString(2, ...);
    int affectedRows = stmt.executeUpdate();
    
    // Get the ID:
    String pk = "";
    ResultSet keys = stmt.getGeneratedKeys();
    if (keys.next()) {
        pk = keys.getString(1);
    }
    

    太丑了,loop x loop,因为一个人可以插入不止一行,而每行生成的键可能不止一个。

    如您所见,这是针对并发并行 INSERTS 的证明。

    关于排序问题:您可能会选择纯数字 ID,也可能是组合主键 CHAR(1)、INT。

    【讨论】:

      【解决方案4】:

      快速解决方法是增加字符后前导“0”的数量。但是问题会在以后出现(例如 99999 和 100000)。

      因此我建议将 ID 解释为从第二个字符开始的数字,并根据该数字值进行顺序比较。

      【讨论】:

      • 刚刚意识到@chetan 已经提到了第二种解决方案
      猜你喜欢
      • 1970-01-01
      • 2015-10-28
      • 2012-04-24
      • 2011-01-11
      • 2017-08-25
      • 2016-07-23
      • 2013-02-04
      • 2021-10-30
      相关资源
      最近更新 更多