重複キー値の防止
Db2 for i は、データベースファイル内で重複したキー値を持つレコードを許可します。 ただし、ファイルに重複キー値が含まれないようにすることができます。
たとえば、キー・フィールドを顧客番号フィールドとして定義するファイルを作成する場合、 システムにファイルの各レコードが固有の顧客番号を持つことを確かめることが望まれます。
ファイルに重複キー値がないようにするには、データ記述仕様 (DDS) で UNIQUE キーワードを指定します。 UNIQUE キーワードを指定すると、キー値がすでにファイルに存在するレコードのキー値と同じである場合、レコードを入力したり、またはファイルにコピーしたりできなくなります。 また固有制約を用いても、強制的に固有キーの保全性を保つことができます。
重複キー値を持つ複数のレコードが物理ファイルにすでに存在する場合には、関連する論理ファイルでは UNIQUE キーワードを指定できません。 関連する物理ファイルに重複キー値が入っているのに、 UNIQUE キーワードを指定して論理ファイルを作成しようとしても、論理ファイルは作成されません。 システムからは、その旨を示すメッセージが送られ、さらに、どのレコードに重複キー値が入っているかを示すメッセージ (最大 20 個) が送られます。
ファイルに UNIQUE キーワードを指定した場合、新しいレコードを追加するためにどのようなファイルを使用したとしても、ファイルに追加されたいずれかのレコードは、ファイル内の既存のレコードのキー値と重複するキー値を持つことはできません。 たとえば、LF1 と LF2 の 2 つの論理ファイルが、物理ファイル PF1 を基にしているとします。 LF1 には、UNIQUE キーワードが指定されています。 PF1 にレコードを追加するのに LF2 を使用した場合に、LF1 に重複キー値が発生するようなときはレコードが追加できなくなります。
キー・フィールドのいずれかで NULL 値が許可されている場合、このようなフィールドに挿入された NULL 値は、ファイルの作成時にアクセス・パスをどのように定義したかによって、重複となる場合とならない場合があります。 UNIQUE キーワードの *INCNULL パラメーターは、固有のアクセス・パスに重複キーが存在するかどうかを判別するときに、NULL 値を含めることを示します。 *EXCNULL パラメーターは、重複キー値が存在するかどうかを判別するときに、NULL 値を含めないことを示します。
以下の例は、固有のキー値を必要とする論理ファイルの DDS を示しています。
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A* ORDER TRANSACTION LOGICAL FILE (ORDFILL)
A UNIQUE
A R ORDHDR PFILE(ORDHDRP)
A K ORDER
A
A R ORDDTL PFILE(ORDDTLP)
A K ORDER
A K LINE
A
この例では、キー・フィールド (ORDHDR レコード様式の Order フィールド、および ORDDTL レコード様式の Order フィールドと Line フィールド) の内容は、レコードが ORDHDRP ファイル、ORDDTLP ファイル、あるいはここで定義されている論理ファイルのどれかから追加されるかを問わず、固有でなければなりません。 Line フィールドを ORDDTL レコード様式の 2 番目のキー・フィールドとして指定しているので、両方の物理ファイルの Order キー・フィールドには同じ値が存在することができます。 物理ファイル ORDDTLP には 2 つのキー・フィールドがあり、物理ファイル ORDHDRP には 1 つのキー・フィールドしかないので、この 2 つのファイルのキー値は対立しません。