挿入したレコードの主キーを取得するクロスデータベースプラットフォームの方法はありますか?
私は この答え は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サーバーの場合、おそらく this one のようなサードパーティのドライバーが必要になります。
幸運を!
oracleの場合、PKEY値を生成するためにシーケンスをマップした場合、HibernateはシーケンスのNEXT_VALUEを使用します。
MySQLサーバーまたはMS SQLサーバーで何が行われるかわからない
Springは this operation に対していくつかの便利なサポートを提供し、リファレンスガイドはあなたの質問に答えるようです:
適切なPreparedStatementを作成するための標準的な単一の方法はありません(これにより、メソッドのシグネチャがそのままである理由が説明されています)。 Oracleで動作し、他のプラットフォームでは動作しない例は...
私はこの例をMySQLでテストしましたが、そこでも機能しますが、他のプラットフォームについて話すことはできません。
SQL-99に準拠するデータベースの場合、ID列を使用できます。CREATETABLE sometable(id INTEGER GENERATED ALWAYS AS IDENTITY(START WITH 101)PRIMARY KEY、...
getGeneratedKeys() を使用して、 executeUpdate(String sql、int autoGeneratedKeys) で挿入されたばかりのキーを取得します。 executeUpdate()の2番目のパラメーターにStatement.RETURN_GENERATED_KEYSを使用します。