In den Sätzen einer NK-ISAM-Datei können neben dem ISAM-Schlüssel (Primärschlüssel) bis zu 30 Sekundärschlüssel definiert werden, über die der Benutzer die gewünschten Datensätze auffinden kann.
Im Unterschied zu herkömmlichen ISAM-Dateien darf eine Datei mit Sekundärschlüsseln weder Wertmarkierungen noch logische Markierungen enthalten. Diese Zusätze zum ISAM-Schlüssel sind durch die Sekundärschlüssel ohnehin entbehrlich geworden.
Die Länge des Primärschlüssels ist auf 255 Byte begrenzt, die Länge jedes Sekundärschlüssels auf 127 Byte.
Die Sekundärschlüssel dürfen sich untereinander und mit dem Primärschlüssel beliebig überlappen, sodass ein Datensatz mit Sekundärschlüsseln z.B. folgenden Aufbau haben kann:
Primärschlüssel (ISAM-Schlüssel)
Jeder Satz einer ISAM-Datei muss einen mindestens ein Byte langen Primärschlüssel besitzen. Die Position des Primärschlüssels im Datensatz wird für alle Sätze der Datei im Makros FILE und FCB mit dem Operanden KEYPOS, im Kommando ADD-FILE-LINK mit dem Operanden KEY-POSITION festgelegt. Bei der Definition der Schlüsselposition müssen Sie das Satzformat (siehe unter „ISAM-Satzformate") berücksichtigen. So kann z.B. in Dateien mit variablem Satzformat der ISAM-Schlüssel erst ab der Position 5 beginnen (KEYPOS >= 5 bzw. KEY-POSITION >= 5) wegen der 4 Bytes für Satzlängenfeld und Steuerinformationen.
Die Schlüssellänge wird durch den Operanden KEYLEN im Makro FILE/FCB bzw. durch den Operanden KEY-LENGTH im Kommando ADD-FILE-LINK festgelegt. Die maximale Schlüssellänge beträgt 255 Byte. Logische Markierungen und Wertmarkierungen sind nicht zulässig.
Das DVS optimiert durch Schlüsselkomprimierung die Anzahl der Indexeinträge im Indexblock, sodass längere Schlüssel auf im Durchschnitt 3-5 Bytes komprimiert werden können und jeder Indexblock durchschnittlich ca. 160 Einträge enthält.
Die Anzahl der Indexeinträge pro Block wirkt sich wiederum aus auf die Gesamtzahl der Indexblöcke und damit auf die Anzahl der Indexstufen einer Datei und die Performance beim Zugriff auf einen Satz.
Sekundärschlüssel
Zusätzlich zum Primärschlüssel darf ein Datensatz bis zu 30 Sekundärschlüssel enthalten. Wie der Primärschlüssel hat auch jeder Sekundärschlüssel in allen Sätzen einer Datei die gleiche Position und Länge.
Anders als beim Primärschlüssel werden die Merkmale eines Sekundärschlüssels (Position, Länge, Zulässigkeit mehrfach auftretender Schlüsselwerte) jedoch nicht im Katalogeintrag, sondern im Kontrollblock der Datei geführt und können daher auch nicht mit dem Makro FSTAT oder dem Kommando SHOW-FILE-ATTRIBUTES ausgegeben werden.
Zur Information über die Sekundärschlüssel einer Datei stellt ISAM deshalb den Makro SHOWAIX und das Kommando SHOW-INDEX-ATTRIBUTES zur Verfügung.
Ein weiterer Unterschied zwischen dem Primärschlüssel und einem Sekundärschlüssel besteht darin, dass der Sekundärschlüssel über einen Namen identifiziert wird. Dies ist notwendig, weil für eine Datei mehrere Sekundärschlüssel vereinbart werden dürfen (während es nur einen Primärschlüssel gibt).
Sekundärschlüssel können nur für eine existierende Datei (d.h. für eine Datei, die bereits mindestens einmal OUTPUT oder OUTIN eröffnet war) definiert werden. Zwar darf die Datei auch leer sein, doch ist es aus Performancegründen zu empfehlen, Sekundärschlüssel für eine neu zu erstellende Datei erst einzurichten, nachdem sie mit Datensätzen geladen worden ist.
Sie können einen Sekundärschlüssel mit dem Makro CREAIX oder dem Kommando CREATE-ALTERNATE-INDEX für eine Datei vereinbaren.
Die Position des Sekundärschlüssels wird mit dem Operanden KEYPOS im Makro bzw. mit dem Operanden KEY-POSITION im Kommando festgelegt. Wie beim Primärschlüssel sind auch hier bei Sätzen variabler Länge 4 Byte für Satzlängenfeld und Steuerinformation zu berücksichtigen (siehe unter „Primärschlüssel (ISAM-Schlüssel)").
Die Länge des Sekundärschlüssels wird mit dem Operanden KEYLEN im Makro bzw. mit dem Operanden KEY-LEN im Kommando festgelegt. Ein Sekundärschlüssel darf bis zu 127 Byte lang sein. Neben der Anzahl wirkt sich auch die Länge der vereinbarten Sekundärschlüssel auf die Dateigröße und die Performance aus: Da der gesamte Schlüssel (ohne Komprimierung) in den Sekundärindexblock aufgenommen wird, hängt von der Schlüssellänge ab, wie viele Indexeinträge in einem Sekundärindexblock untergebracht werden können.
Mit dem Operanden KEYNAME im Makro bzw. KEY-NAME im Kommando wird dem Sekundärschlüssel ein Name zugeordnet. Mit diesem Namen können Sie sich in den Makros GET, GETR, GETKY und SETL auf ihn beziehen und so den Sekundärschlüssel (analog dem Primärschlüssel) für Lese- und Zeigeroperationen nutzen. Außerdem dient der Name im Makro DELAIX oder im Kommando DELETE-ALTERNATE-INDEX dazu, den Sekundärschlüssel anzugeben, der gelöscht werden soll. Über alle in einer Datei definierten Sekundärschlüssel können Sie sich mit dem Makro SHOWAIX oder mit dem Kommando SHOW-INDEX-ATTRIBUTES informieren.
Mehrfache Sekundärschlüssel (Duplicate Key)
In Dateien mit Sekundärschlüsseln müssen die Werte des Primärschlüssels eindeutig sein. Sekundärschlüsselwerte können dagegen mehrfach auftreten, sofern Sie dies nicht durch die Angabe DUPKEY=NO im Makro CREAIX bzw. DUPLICATE-KEY=*NO im Kommando CREATE-ALTERNATE-INDEX ausschließen.
Intern legt das DVS für jeden in der Datei vereinbarten Sekundärschlüssel einen oder mehrere Sekundärindexblöcke an, die für jeden in der Datei vorkommenden Wert dieses Sekundärschlüssels einen Eintrag aufnehmen, der auf den Primärschlüssel des zugehörigen Datensatzes verweist (Näheres siehe Abschnitt „Sekundärindexblock (NK-ISAM)" (Primärindexblock (ISAM-Indexblock) und Sekundärindexblock)). Kommt ein Wert eines Sekundärschlüssels in mehreren Datensätzen vor, so enthält der zugehörige Eintrag im Sekundärindexblock auch mehrere Verweise auf die Primärschlüsselwerte dieser Datensätze. Diese Verweise sind in der Reihenfolge ihres Entstehens sortiert, d.h in der Reihenfolge, in der sie in den Sekundärindexblock geschrieben oder dort verändert wurden. (Zur internen Verwaltung fügt NK-ISAM jedem solchen Verweis auf einen Primärschlüssel zum Zeitpunkt seiner Entstehung einen Zeitstempel an.)
Sequenzielle Leseoperationen über einen Sekundärschlüssel stellen demnach die Sätze in der Reihenfolge bereit, in der die Verweise auf die zugehörigen Primärschlüsselwerte entstanden sind, d.h. in den Sekundärindexblock geschrieben oder dort verändert wurden. Beim „Rückwärtslesen“ ist die Reihenfolge umgekehrt.
Nichtsequenzielles Lesen über einen Sekundärschlüssel liefert immer den ersten Satz einer Satzfolge mit gleichen Sekundärschlüsselwerten. Die weiteren Sätze dieser Folge müssen dann sequenziell gelesen werden.
Markierungen im ISAM-Index
In Dateien mit Sekundärschlüsseln ist weder Wert- noch logische Markierung zulässig.
ISAM-Satzformate
Für Datensätze mit Sekundärschlüsseln gelten die gleichen Hinweise wie für Datensätze ohne Sekundärschlüssel (siehe "Datensatz ohne Sekundärschlüssel").
Bei der nachträglichen Vereinbarung von Sekundärschlüsseln für nichtleere Dateien mit RECFORM=V bzw. mit RECORD-FORMAT=*VARIABLE ist bei der Wahl der Schlüsselpositionen und -längen jedoch zusätzlich darauf zu achten, dass auch der kürzeste Datensatz in der Datei den zu definierenden Sekundärschlüssel noch vollständig enthalten muss.