先週私が持っていたJavaの問題に答えました(感謝!)、私は今DB2に関する新しい問題に取り組んでいます...私が取り組んでいるJavaアプリケーションは、 Webフォームを作成し、DB2ファイル(データベース)に入れます。 JavaのPreparedStatementオブジェクトに渡されたSQL文字列は次のとおりです。ここでDB2のユニークなインデックスとオートナンバリング
insert into EVCRPTFL (
AUID, URLEX, URNEX, URNAME, URRCPT, URRUN, URRECT, URRECS, URRDYS, URRWKS, URRMHS, URRMTH, URRDAY, URRTHE, URRWHT, URRWDY, UREXPT, UROCRM, UROCRN, UREXPR, URSTTS, URACTV, URRPT, URD1YR, URD1YN, URD1MR, URD1MN, URD1DR, URD1DN, URD2YR, URD2YN, URD2MR, URD2MN, URD2DR, URD2DN, URRPAR, URLANG, URCTRY
)
values (
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
)
は、テーブル作成スクリプトです:
CREATE TABLE EVCRPTFL (
URID int NOT NULL,
AUID decimal(11,0) NOT NULL,
URLEX timestamp,
URNEX timestamp,
URNAME varchar(40) NOT NULL,
URRCPT varchar(500) NOT NULL,
URRUN timestamp,
URRECT char(1) NOT NULL,
URRECS int NOT NULL,
URRDYS int NOT NULL,
URRWKS int NOT NULL,
URRMHS int NOT NULL,
URRMTH int NOT NULL,
URRDAY int NOT NULL,
URRTHE int NOT NULL,
URRWHT int NOT NULL,
URRWDY int NOT NULL,
UREXPT int NOT NULL,
UROCRM int NOT NULL,
UROCRN int NOT NULL,
UREXPR timestamp,
URSTTS char(1) NOT NULL,
URACTV timestamp,
URRPT int NOT NULL,
URD1YR int,
URD1YN int,
URD1MR int,
URD1MN int,
URD1DR int,
URD1DN int,
URD2YR int,
URD2YN int,
URD2MR int,
URD2MN int,
URD2DR int,
URD2DN int,
URRPAR varchar(1000),
URLANG char(2),
URCTRY char(2)
);
CREATE UNIQUE INDEX EVCRPTFL ON EVCRPTFL(URID);
あなたが見ることができるように、それは除いてSQL文字列内のすべての値を渡しています最初のもの、URID。レコードが挿入された後、私はID番号を持つデータベースでそれを見ることができます。これはデータベースが自動的にURIDを追加していることを意味します(つまり、IDはJavaコードで生成されずにデータベースに渡されます)。以前のOracleとPHPの経験では、Oracle Sequenceを使用して自動フィールドを作成しましたが、MySQL、Postgres、その他のデータベースシステムにはほぼ同様の機能があることを認識していますが、自動番号付けはDB2で機能します。
DB2についてよく知っている私の同僚も困惑しています。彼は、彼が見ていることに応じてテーブルにトリガが設定されていないと言いますが、RPGコードでは、ID番号がコードで生成され、データベースによって生成されるのではなくデータベースに渡される自体。
私の質問は:URIDのユニークインデックスもID番号を自動生成するのですか、それともデータベースやJavaコードのいずれかを探している必要がありますか?
私の最終的な質問は次のとおりです。関連するデータを格納する別のテーブルに挿入するには、最終的にURID番号を使用する必要があります。 Oracleでは、これは "insert into return into"を実行し、コード内のパラメータ化されたid_variableからデータを取り戻すことで行われました。 DB2にも同様の機能がありますか?私はIDENTITY_VAL_LOCAL関数に関するドキュメントを見つけましたが、IDENTITY_VAL_LOCALの呼び出しと最初の挿入の間に別の挿入がWebフォームから発生した場合など、正しいIDを返すことが常に保証されるようには見えません...
必要に応じてコードサンプルやその他のデータベース情報を提供できます。ありがとう!
IDENTITY_VAL_LOCALが接続のスコープになっていると思います... – kem
@kem:最後に使用したID(prepareStatement(sql、Statement.RETURN_GENERATED_KEYS))を返すJavaメソッドが見つかりました。 )私は潜在的な競合状態について心配する必要はありませんが、私はDB2が自動番号付けをどのように処理するかについてまだ興味があります。すべてのSQL実装と同じように見えます。 "標準についての素敵な点は、私が推測するものがたくさんあるということです。" – Sam