1

JSP + ServletsOracle10バックエンドとしてWeb アプリケーションを開発しています。

顧客に関連する情報を格納するためのテーブルがあります。

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

上記の表は主キーで、 (最初の文字+ 数字 (数字は最低 4 文字の長さである必要があるため、最初の ID の場合、数字に 3 つの先行ゼロが追加されます)) にID応じて自動生成されます。CityCity

For Generating ID:
テーブルから Largest ID を取得するために次のクエリを使用してから、いくつかの Java コード Auto Generate Next を使用していますID

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

次に、ID が に到達するまで期待どおりの最初のIDものを取得しますが、それ以上の場合、クエリはLargest として私を与えます。ResultSetN9999IDN10000N9999ID

後の出力N9999:

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

出力期待

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

私の質問は、上記のクエリに何か問題がありますか? または、文字列を含む ID を自動生成するより良い方法はありますか。

Edit1 私の要件はID、開始位置に文字を含む自動生成することです。

4

4 に答える 4

2

ID は数値ではなく文字列であるため、ソート方法が異なります。次のように sth を実行した場合、希望どおりにソートされます。

0001N
0002N
...

または文字列ではなく数値のみを格納

于 2013-07-01T10:50:12.770 に答える
2

このクエリを使用

select ID from CUST where CITY='NASIK' order by to_number(substr(ID,2)) desc;
于 2013-07-01T10:52:30.533 に答える
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 に答える