在java中自动生成ID

时间:2013-07-01 10:47:45

标签: java oracle auto-generate

我正在使用 JSP + Servlets Oracle10 开发一个Web应用程序作为后端

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

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

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

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

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

然后从ID获得第一个ResultSet,这是预期的,直到ID到达N9999,但当IDN10000或更高时查询正在向我N9999提供最大ID

N9999之后的输出:

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

输出期望

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

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

EDIT1 我的要求是自动生成ID,其中包含起始位置的字符。

4 个答案:

答案 0 :(得分:2)

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

0001N
0002N
...

或仅存储数字,而不是字符串

答案 1 :(得分:2)

使用此查询

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

答案 2 :(得分:1)

使用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);
}

它是如此丑陋,循环x循环,因为可以插入多行,并且每行生成的密钥可能不止一个。

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

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

答案 3 :(得分:1)

快速修复将增加角色后面的前导'0'的数量。但后来问题会发生(例如99999和100000)。

因此我建议将ID解释为第二个字符的数字,然后对该数字值进行顺序比较。