1

我正在开发一个使用JSP + ServletsOracle10作为后端的 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 代码 Auto Generate Next ID

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

ID然后按预期从其中获取第一个,ResultSet直到 ID 到达N9999,但是当IDisN10000或更高时,查询将给我N9999作为 Largest ID

之后的输出N9999

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

输出预期

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

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

Edit1 我的要求是自动生成ID将在起始位置包含字符的字符。

4

4 回答 4

2

使用这个查询

select ID from CUST where CITY='NASIK' order by to_number(substr(ID,2)) desc;
于 2013-07-01T10:52:30.533 回答
2

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

0001N
0002N
...

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

于 2013-07-01T10:50:12.770 回答
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。

于 2013-07-01T11:02:17.967 回答
1

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

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

于 2013-07-01T12:49:44.657 回答