重複キー

重複した値を持つキーを定義できます。ただし、レコードの主キーの値は一意にする必要があるため、主キーの重複は許容されません。

重複キーを使用する場合は、各キーに同じ値を指定できる回数が制限される点に注意してください。重複キーに同じ値を指定するたびに、キーの出現 (オカレンス) 回数が 1 ずつ増えます。個々のキーに対して許容される重複値の最大回数は、索引ファイルの種類によって異なります。索引ファイルの種類およびその特徴の詳細なリストについては、「索引ファイルの種類」を参照してください。

重複オカレンス値は、値が重複するキーを一意に識別するためにキーに追加される一意の識別子です。新しいキーを追加する際に、同じ値を持つキーが存在している場合、前回追加されたキーのオカレンス値に 1 を追加した値が、新しいキーのオカレンス値として使用されます。いずれかの重複キーを削除しても、残りのキーは変更されないため、一連の重複キーのうち最大オカレンス値を持つキーが削除されない限り、最大オカレンス値も変化しません。最大オカレンス値を持つキーを削除すると、残りの重複キーのオカレンス値の中で最も大きな値が最大オカレンス値になります。

COBOL システムでは、重複キー レコードを作成順に読み込むためにオカレンス番号を使用します。そのため、削除したレコードのオカレンス番号は再利用できません。つまり、一部のキーをすでに削除した場合でも、重複値の最大回数に到達する可能性があります。

索引ファイルの種類によっては、データ ファイルに重複するオカレンス レコードを持つものもあります。索引ファイルに重複オカレンス レコードが含まれている場合は、データ ファイルの各レコードの後に、システム レコードが続きます。このシステム レコードには、そのレコードの各重複キーに対するキーの出現番号が保持されます。この番号は、ファイルの履歴内で、あるキー値が使用された回数を示すカウンターに過ぎません。重複オカレンス レコードが存在すると、多数の重複値を持つレコードに対する REWRITE および DELETE 操作が非常に高速になりますが、このようなファイルのデータ レコードは標準的なファイルのデータ レコードよりも大きくなります。

副キーに重複値を指定するには、SELECT 句の ALTERNATE RECORD KEY 句で WITH DUPLICATES を使用します。

 file-control.
     select idxfile assign to "idx.dat"
         organization is indexed
         record key is idxfile-record-key
         alternate record key is idxfile-alt-key 
                                 with duplicates.