DB2 Version 9.7 for Linux, UNIX, and Windows

ID 列のロードに関する考慮事項

ロード・ユーティリティーを使用すると、入力データに ID 列の値があるかどうかにかかわりなく、ID 列が含まれている表にデータをロードできます。

ID 関連のファイル・タイプ修飾子が使用されない場合、 このユーティリティーは次のような規則に従って動作します。

ロード・ユーティリティーは、ユーザー提供の ID 値に関して、 ID 列のデータ・タイプ (SMALLINT、INT、BIGINT、または DECIMAL) の値に対して通常以外の妥当性検査は行いません。 値が重複していても報告されません。

ほとんどの場合、ロード・ユーティリティーは、行への ID 列値の割り当て順がデータ・ファイル内での出現順と同じになることを保証できません。 ID 列値の割り当てはロード・ユーティリティーが並列で管理するため、これらの値は任意の順に割り当てられます。 これについての例外は、以下のとおりです。

表をパーティション・データベースにロードするときに、 表のパーティション・キーに ID 列があり、identityoverride 修飾子が指定されていない場合、SAVECOUNT オプションを指定できません。 パーティション・キーに ID 列があり、ID 値が生成されている場合、少なくとも 1 つのデータベース・パーティション上のロード・フェーズからロードを再始動するには、ロード・フェーズの最初からロード全体を再始動する必要があります。これは、整合点が見つからないことを意味します。

注: 以下の基準すべてが満たされている場合、ロード RESTART 操作は許可されません。 代わりに LOAD TERMINATE または LOAD REPLACE 操作を実行してください。

ID 列が含まれている表にデータをロードする操作を簡略化するには、ファイル・タイプ修飾子として、identitymissingidentityignore、および identityoverride の 3 つのうちのいずれかを使用する方法があります。これらの指定は相互に排他的です。

ID 列を持たないデータのロード
identitymissing 修飾子は、 入力データ・ファイルに ID 列の値が入っていない (NULL すらない) 場合に、 ID 列を持つ表のロードを容易にします。 例えば、 次のような SQL ステートメントで定義された表があるとします。
   create table table1 (c1 varchar(30),
                        c2 int generated by default as identity,
                        c3 decimal(7,2),
                        c4 char(1))
ID 列を持たない表からエクスポートされたファイル (load.del) からデータを TABLE1 にロードする場合、以下の例を参照してください。
   Robert, 45.2, J
   Mike, 76.9, K
   Leo, 23.4, I
このファイルをロードする 1 つの方法は、 次のように LOAD コマンドを使用して、ロードする列を明示的にリストすることです。
   db2 load from load.del of del replace into table1 (c1, c3, c4)
ただし、多くの列を持つ表の場合、 この構文は扱いにくく、誤りを生じる可能性があります。 ファイルをロードする別の方法は、 次のように identitymissing ファイル・タイプ修飾子を使うことです。
   db2 load from load.del of del modified by identitymissing
      replace into table1
このコマンドを実行すると、データ・ファイルの 3 つの列が TABLE1 の c1、c3、および c4 にロードされます。 値は c2 の各行に生成されます。
ID 列を持つデータのロード
identityignore 修飾子を指定すると、ロード・ユーティリティーは、入力データ・ファイルに ID 列用のデータが入っていても、そのデータを無視して、各行ごとに ID 値を生成します。 例えば、上記で定義したように、 ユーザーが次のようなデータの入ったデータ・ファイル (load.del) から TABLE1 をロードするとします。
   Robert, 1, 45.2, J
   Mike, 2, 76.9, K   
   Leo, 3, 23.4, I
ユーザー指定値の 12、 および 3 が ID 列に使われない場合は、 次のような LOAD コマンドを発行することができます。
   db2 load from load.del of del method P(1, 3, 4)
      replace into table1 (c1, c3, c4)
ここでも、表に多くの列があると、 このアプローチは扱いにくく、誤りを生じる可能性があります。 次のように identityignore 修飾子を使用すると、 構文が単純化されます。
   db2 load from load.del of del modified by identityignore
      replace into table1

ユーザー指定値を持つデータのロード
identityoverride 修飾子は、 GENERATED ALWAYS ID 列をもつ表にユーザー指定値をロードするために使用します。 これが非常に役立つのは、 別のデータベース・システムからデータをマイグレーションするときに GENERATED ALWAYS として表を定義しなければならない場合、 または ROLLFORWARD DATABASE コマンドで DROPPED TABLE RECOVERY オプションを使用してリカバリーしたデータから表をロードする場合です。 この修飾子を使用した場合、 ID 列でデータ (または NULL データ) の入っていない行はリジェクトされます (SQL3116W)。 この修飾子を使用すると、 GENERATED ALWAYS 列の固有性特性に違反する可能性があることも覚えておいてください。 この違反が発生した場合にはまず LOAD TERMINATE 操作を実行し、その後、LOAD INSERT または LOAD REPLACE 操作を実行してください。