我正在使用 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
中是一个主键,它是根据City
(City
的第一个字符+数字自动生成的(数字必须至少为4个字符长,所以对于第一个ID,三个前导零将被添加到数字))
For Generating ID:
我使用以下查询从表中获取最大ID,然后使用一些java代码自动生成下一个ID
。
query = "select ID from CUST where CITY='NASIK' order by ID desc";
然后从ID
获得第一个ResultSet
,这是预期的,直到ID到达N9999
,但当ID
为N10000
或更高时查询正在向我N9999
提供最大ID
。
N9999
之后的输出:
ID
----------
N9999
N10001
N10000
N0002
N0001
输出期望
ID
----------
N10001
N10000
N9999
N0002
N0001
所以我的问题是上面的查询有什么问题吗?或者有更好的方法来自动生成包含String的ID。
EDIT1
我的要求是自动生成ID
,其中包含起始位置的字符。
答案 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解释为第二个字符的数字,然后对该数字值进行顺序比较。