挿入したばかりのレコードの主キーを取得するためのクロスデータベースプラットフォームの方法はありますか?
この回答は、Callingで取得できることをSELECT LAST_INSERT_ID()
示してSELECT @@IDENTITY AS 'Identity';
おり、jdbcのデータベース間でこれを行う一般的な方法はありますか?
そうでない場合は、SQL Server、MySQL、およびOracleのいずれかにアクセスできるコードにこれを実装することをどのように提案しますか?
私のコードからコピー:
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);
}
これがあなたに良い出発点を与えることを願っています。
エクストラネオンの答えは正しいですが、 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);
}
Statement.executeUpdate()メソッドとStatement.getGeneratedKeys ()メソッドを試しましたか?このアプローチについて言及しているdeveloperWorksの記事があります。
また、JDBC 4.0では、Sunは、行に対して一意のハンドルを取得できるrow_id機能を追加しました。この機能は、OracleおよびDB2でサポートされています。SQLサーバーの場合、おそらくこのようなサードパーティのドライバーが必要になります。
幸運を!
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()
Oracle の場合、PKEY 値生成のためにシーケンスをマップした場合、Hibernate はシーケンスから NEXT_VALUE を使用します。
MySQLまたはMS SQLサーバーで何をするかわからない
Spring はこの操作に役立つサポートを提供しており、リファレンス ガイドはあなたの質問に答えているようです。
適切な PreparedStatement を作成するための標準的な単一の方法はありません (メソッド シグネチャがそのようになっている理由を説明しています)。Oracle で動作し、他のプラットフォームでは動作しない可能性がある例は...
この例を MySQL でテストしたところ、そこでも動作しますが、他のプラットフォームについては言えません。