2010-12-28 19 views
0

先週私が持っていた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を返すことが常に保証されるようには見えません...

必要に応じてコードサンプルやその他のデータベース情報を提供できます。ありがとう!

+0

IDENTITY_VAL_LOCALが接続のスコープになっていると思います... – kem

+0

@kem:最後に使用したID(prepareStatement(sql、Statement.RETURN_GENERATED_KEYS))を返すJavaメソッドが見つかりました。 )私は潜在的な競合状態について心配する必要はありませんが、私はDB2が自動番号付けをどのように処理するかについてまだ興味があります。すべてのSQL実装と同じように見えます。 "標準についての素敵な点は、私が推測するものがたくさんあるということです。" – Sam

答えて

0

URIDのユニークインデックスは、ID番号を自動生成しません。

これを行うためのDB2の方法は、デフォルトで生成されるか、またはあなたのURIDの列の定義に、GENERATED ALWAYS追加することです。

がGENERATED BY DEFAULT
URID int NOT NULL 
    GENERATED BY DEFAULT AS IDENTITY(START WITH 1, INCREMENT BY 1) 
    UNIQUE 

あなたがそれを必要とする場合は、カスタム値を指定できます。

CREATE TABLEステートメントのドキュメントを調べることをおすすめします。

+0

私はDB2のドキュメントでDEFAULT/ALWAYSを生成しましたが、リストにあるテーブル作成ステートメント上記のように、このテーブルはそれを使用していなかったと仮定して動作しています...価値があるものとして、私はJDBC ODBCブリッジでSQuirreL SQLクライアントを使用しています。正確にテーブルが作成されたもの。DB2が使用する自動番号付けの他のソースはありますか? – Sam

+0

導入されたDB2のバージョンはわかりませんが、シーケンスを使用することもできます。 CREATE SEQUENCE(http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/topic/com.ibm.db2z10.doc.sqlref/db2z_sql_createsequence.htm)の資料にはいくつかの例があります。 – Leons

関連する問題