DB2 Universal Database - Systemverwaltung


Definieren einer oder mehrerer Spalten als Primärschlüssel

Ein Schlüssel ist eine Gruppe von Spalten, deren Hilfe eine Zeile oder Zeilen identifiziert werden oder auf sie zugegriffen wird. Der Schlüssel wird in der Beschreibung einer Tabelle, eines Index oder einer referentiellen Integritätsbedingung angegeben. Eine Spalte kann zu mehreren Schlüsseln gehören.

Ein eindeutiger Schlüssel ist ein Schlüssel mit der Integritätsbedingung, daß nicht zwei seiner Werte gleich sein dürfen. Die Spalten eines eindeutigen Schlüssels können keine Nullwerte enthalten. Zum Beispiel kann eine Spalte mit der Personalnummer als eindeutiger Schlüssel definiert werden, da jeder Wert in der Spalte nur einen Mitarbeiter identifiziert. Innerhalb eines Unternehmens können nicht zwei Mitarbeiter dieselbe Personalnummer haben.

Der Mechanismus, mit dem die Eindeutigkeit sichergestellt wird, wird als eindeutiger Index bezeichnet. Der eindeutige Index einer Tabelle ist eine Spalte oder eine geordnete Gruppe von Spalten, deren Werte jeweils eine Zeile eindeutig identifizieren (funktionell bestimmen). Ein eindeutiger Index kann Nullwerte enthalten.

Der Primärschlüssel ist einer der für eine Tabelle definierten eindeutigen Schlüssel, der jedoch als Schlüssel mit der höchsten Priorität ausgewählt ist. Es kann nur einen Primärschlüssel für eine Tabelle geben.

Für den Primärschlüssel wird automatisch ein Primärindex erstellt. Der Primärindex wird vom Datenbankmanager zum effizienten Zugriff auf Tabellenzeilen verwendet und ermöglicht es dem Datenbankmanager, die Eindeutigkeit des Primärschlüssels zu erhalten. (Sie können außerdem Indizes für Spalten definieren, die nicht zum Primärschlüssel gehören, um bei der Verarbeitung von Abfragen einen effizienten Zugriff auf Daten bieten zu können.)

Wenn die Tabelle keinen "natürlichen" eindeutigen Schlüssel besitzt, oder wenn zur Unterscheidung eindeutiger Zeilen die Eingangsfolge verwendet wird, kann auch die Verwendung einer Zeitmarke als Bestandteil des Schlüssels sinnvoll sein. (Siehe auch Definieren von IDENTITY-Spalten.)

Primärschlüssel für einige der Beispieltabellen sind folgende:

Tabelle
Schlüsselspalte

Tabelle EMPLOYEE
EMPNO

Tabelle DEPARTMENT
DEPTNO

Tabelle PROJECT
PROJNO

Das folgende Beispiel zeigt einen Teil der Tabelle PROJECT mit ihrem Primärschlüssel.

Tabelle 6. Ein Primärschlüssel in der Tabelle PROJECT
PROJNO (Primärschlüssel) PROJNAME DEPTNO
MA2100 Weld Line Automation D01
MA2110 Weld Line Programming D11

Wenn jede Spalte einer Tabelle doppelte Werte enthält, kann kein Primärschlüssel aus nur einer Spalte definiert werden. Ein Schlüssel, der aus mehreren Spalten besteht, wird als zusammengesetzter Schlüssel bezeichnet. Die Kombination der Spaltenwerte muß eine Entität eindeutig definieren. Wenn ein zusammengesetzter Schlüssel nicht einfach definiert werden kann, ist eventuell die Erstellung einer neuen Spalte mit eindeutigen Werten in Betracht zu ziehen.

Das folgende Beispiel zeigt einen Primärschlüssel, der mehrere Spalten (einen zusammengesetzten Schlüssel) enthält:

Tabelle 7. Ein zusammengesetzter Primärschlüssel in der Tabelle EMP_ACT
EMPNO (Primärschlüssel) PROJNO (Primärschlüssel) ACTNO   (Primärschlüssel) EMPTIME EMSTDATE (Primärschlüssel)
000250 AD3112 60 1.0 1982-01-01
000250 AD3112 60 .5 1982-02-01
000250 AD3112 70 .5 1982-02-01

Identifizieren möglicher Schlüsselspalten

Ein Schlüsselkandidat wird durch die kleinste Anzahl von Spalten festgelegt, die eine Entität eindeutig definieren. Es kann mehrere Schlüsselkandidaten geben. In Tabelle 2 gibt es scheinbar mehrere Schlüsselkandidaten. Die Spalten EMPNO, PHONENO und LASTNAME identifizieren den Mitarbeiter eindeutig.

Bei der Auswahl eines Primärschlüssels aus einer Gruppe möglicher Schlüssel sollten die Kriterien Permanenz, Eindeutigkeit und Stabilität beachtet werden.

Von den drei möglichen Schlüsselspalten im genannten Beispiel erfüllt nur die Spalte EMPNO alle Kriterien. Es kann zum Beispiel vorkommen, daß ein Mitarbeiter keine Telefonnummer (PHONENO) hat, wenn er in die Firma eintritt. Nachnamen (LASTNAME) können sich ändern und sind, wenn auch vielleicht zu einem bestimmten Zeitpunkt, so doch nicht unbedingt immer eindeutig. Die Personalnummer (EMPNO) ist die beste Wahl für den Primärschlüssel. Ein Mitarbeiter erhält nur einmal eine eindeutige Nummer, und diese Nummer wird in der Regel nicht geändert, solange der Mitarbeiter in der Firma bleibt. Da jeder Mitarbeiter unbedingt eine Nummer haben muß, gilt auch das Kriterium der Permanenz für die Werte dieser Spalte.

Definieren von IDENTITY-Spalten

Eine IDENTITY-Spalte stellt für DB2 eine Methode dar, automatisch einen eindeutigen numerischen Wert für jede Zeile in einer Tabelle zu generieren. Eine Tabelle kann eine einzelne Spalte besitzen, die mit dem Attribut IDENTITY definiert ist. Beispiele für IDENTITY-Spalten sind Auftragsnummern, Personalnummern, Bestandsnummern und Vorfallsnummern.

Werte für eine IDENTITY-Spalte können immer oder standardmäßig generiert werden.

IDENTITY-Spalten eignen sich ideal zur Generierung eindeutiger Primärschlüsselwerte. Anwendungen können IDENTITY-Spalten nutzen, um Problemen beim gemeinsamen Zugriff und Leistungsproblemen vorzubeugen, die entstehen können, wenn eine Anwendung einen eigenen eindeutigen Zähler außerhalb der Datenbank generiert. Zum Beispiel besteht eine gängige Implementierung auf Anwendungsebene darin, eine 1-zeilige Tabelle mit einem Zähler zu pflegen. Jede Transaktion sperrt diese Tabelle, erhöht den Wert des Zählers und schreibt die Änderung fest. Das heißt, zu einem gegebenen Zeitpunkt kann nur eine Transaktion den Wert des Zählers erhöhen. Wenn im Unterschied dazu der Zähler durch eine IDENTITY-Spalte realisiert wird, können wesentliche höhere Ebenen des gemeinsamen Zugriffs erreicht werden, weil der Zähler nicht durch Transaktionen gesperrt wird. Eine nicht festgeschriebene Transaktion, die den Wert des Zählers erhöht hat, hindert nachfolgende Transaktionen nicht daran, den Zähler ebenfalls zu erhöhen.

Der Wert des Zählers für die IDENTITY-Spalte wird unabhängig von der Transaktion erhöht (oder verringert). Wenn eine bestimmte Transaktion einen IDENTITY-Zähler zweimal erhöht, stellt diese Transaktion möglicherweise einen Abstand zwischen den beiden generierten Nummern fest, weil vielleicht andere Transaktionen zur gleichen Zeit denselben IDENTITY-Zähler ebenfalls erhöhen (d. h. Zeilen in die gleiche Tabelle einfügen). Wenn eine Anwendung unbedingt einen aufeinander folgenden Bereich von Nummern erhalten muß, sollte die Anwendung eine exklusive Sperre für die Tabelle definieren, in der die IDENTITY-Spalte enthalten ist. Diese Entscheidung muß jedoch gegen die daraus folgende Einbuße an gemeinsamen Zugriff abgewogen werden. Weiterhin ist es möglich, daß eine bestimmte IDENTITY-Spalte so aussehen kann, als habe sie Sprünge in den Nummern generiert, weil eine Transaktion, die einen Wert für die IDENTITY-Spalte generierte, rückgängig gemacht wurde, oder weil die Datenbank, die einen Bereich von Werten in einem Cache gespeichert hatte, deaktiviert wurde, bevor alle im Cache gespeicherten Werte zugeordnet werden konnten.

Die fortlaufenden Nummern, die durch die IDENTITY-Spalte generiert werden, besitzen die folgenden zusätzlichen Merkmale:


[ Seitenanfang | Vorherige Seite | Nächste Seite | Inhaltsverzeichnis | Index ]