web-dev-qa-db-ja.com

挿入された行jdbcの主キー?

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

私は この答えSELECT LAST_INSERT_ID()を呼び出すことでそれを取得できると述べており、SELECT @@IDENTITY AS 'Identity';を呼び出すことができると思いますjdbc?

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

42
Omar Kooheji

私のコードからコピー:

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);
}

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

55
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);
}
23
atripathi

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

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

幸運を!

3
johnstok

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

MySQLサーバーまたはMS SQLサーバーで何が行われるかわからない

1
anjanb

Springは this operation に対していくつかの便利なサポートを提供し、リファレンスガイドはあなたの質問に答えるようです:

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

私はこの例をMySQLでテストしましたが、そこでも機能しますが、他のプラットフォームについて話すことはできません。

1
Dónal

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を使用します。

1
Jeff Miller