44

挿入したばかりのレコードの主キーを取得するためのクロスデータベースプラットフォームの方法はありますか?

この回答は、Callingで取得できることをSELECT LAST_INSERT_ID()示してSELECT @@IDENTITY AS 'Identity';おり、jdbcのデータベース間でこれを行う一般的な方法はありますか?

そうでない場合は、SQL Server、MySQL、およびOracleのいずれかにアクセスできるコードにこれを実装することをどのように提案しますか?

4

7 に答える 7

59

私のコードからコピー:

pInsertOid = connection.prepareStatement(INSERT_OID_SQL, Statement.RETURN_GENERATED_KEYS);

ここで、pInsertOidはプリペアドステートメントです。

次に、キーを取得できます。

// fill in the prepared statement and
pInsertOid.executeUpdate();
ResultSet rs = pInsertOid.getGeneratedKeys();
if (rs.next()) {
  int newId = rs.getInt(1);
  oid.setId(newId);
}

これがあなたに良い出発点を与えることを願っています。

于 2008-10-14T19:40:32.297 に答える
24

エクストラネオンの答えは正しいですが、 Oracle では機能しません

Oracle でこれを行う方法は次のとおりです。

String key[] = {"ID"}; //put the name of the primary key column

ps = con.prepareStatement(insertQuery, key);
ps.executeUpdate();

rs = ps.getGeneratedKeys();
if (rs.next()) {
    generatedKey = rs.getLong(1);
}
于 2012-12-14T06:19:58.497 に答える
3

Statement.executeUpdate()メソッドとStatement.getGeneratedKeys ()メソッドを試しましたか?このアプローチについて言及しているdeveloperWorksの記事があります。

また、JDBC 4.0では、Sunは、行に対して一意のハンドルを取得できるrow_id機能を追加しました。この機能は、OracleおよびDB2でサポートされています。SQLサーバーの場合、おそらくこのようなサードパーティのドライバーが必要になります。

幸運を!

于 2008-10-14T21:26:02.567 に答える
1

SQL-99に準拠するデータベースの場合、ID列を使用できます。CREATETABLE sometable(id INTEGER GENERATED ALWAYS AS IDENTITY(START WITH 101)PRIMARY KEY、.. ..

getGeneratedKeys()を使用して、 executeUpdate(String sql、int autoGeneratedKeys)で挿入されたばかりのキーを取得します。実行する2番目のパラメーターにStatement.RETURN_GENERATED_KEYSを使用しますUpdate()

于 2011-09-27T13:54:33.020 に答える
1

Oracle の場合、PKEY 値生成のためにシーケンスをマップした場合、Hibernate はシーケンスから NEXT_VALUE を使用します。

MySQLまたはMS SQLサーバーで何をするかわからない

于 2008-10-14T21:01:47.780 に答える
1

Spring はこの操作に役立つサポートを提供しており、リファレンス ガイドはあなたの質問に答えているようです。

適切な PreparedStatement を作成するための標準的な単一の方法はありません (メソッド シグネチャがそのようになっている理由を説明しています)。Oracle で動作し、他のプラットフォームでは動作しない可能性がある例は...

この例を MySQL でテストしたところ、そこでも動作しますが、他のプラットフォームについては言えません。

于 2008-10-17T16:16:59.880 に答える