質問
挿入したばかりのレコードの主キーを取得するためのクロスデータベースプラットフォームの方法はありますか?
この回答は、 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);
}
これが良い出発点になることを願っています。
他のヒント
extraneonの答えは正しいですが、 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 などのサードパーティのドライバーが必要になります。 。
がんばって!
oracleの場合、PKEY値生成用にシーケンスをマッピングしている場合、HibernateはシーケンスのNEXT_VALUEを使用します。
MySQLまたはMS SQLサーバーで何が行われるかわからない
Springは、この操作とリファレンスガイドがあなたの質問に答えているようです:
標準的な単一の方法はありません 適切なものを作成する PreparedStatement(理由を説明します メソッドのシグネチャはそれです です)。 Oracleで機能する例 他のプラットフォームでは動作しない可能性があります は...
MySQLでこの例をテストしましたが、そこでも動作しますが、他のプラットフォームについて話すことはできません。
SQL-99に準拠するデータベースの場合、ID列を使用できます。 CREATE TABLE sometable(id INTEGER GENERATED ALWAYS AS IDENTITY(START WITH 101)PRIMARY KEY、...
getGeneratedKeys()を使用します。 で executeUpdate(String sql、int autoGeneratedKeys)。 2番目のパラメーターにStatement.RETURN_GENERATED_KEYSを使用して、executeUpdate()
を実行します。 id列をNULLプライマリキーではなくid整数として宣言するだけ auto_increment
この後、このコードを実行します
ResultSet ds=st.executeQuery("select * from user");
while(ds.next())
{
ds.last();
System.out.println("please note down your registration id which is "+ds.getInt("id"));
}
ds.close();
上記のコードは現在の行のIDを表示します
ds.last()
を削除すると、id列のすべての値が表示されます