Primärschlüsselspalten in MySQL
Primärschlüssel
Eine bestimmte Spalte (oder eine Kombination von Spalten) einer jeden Tabelle kann und sollte in MySQL als „Primärschlüssel“ festgelegt werden. Eine Tabelle kann höchstens einen solchen Primärschlüssel haben.
Integritätsregeln
- Zu jedem Wert des Primärschlüssels darf es höchstens eine Zeile in der Tabelle geben.
- In der Tabelle darf keine Zelle einer Primärschlüsselspalte den Wert »NULL« enthalten.
Wir nennen eine Spalte eindeutig, wenn jeder Wert dieser Spalte in höchstens einer Zeile der Tabelle vorkommen darf. In diesem Sinne kann man die erste Regel auch als „Der Primärschlüssel muß eindeutig sein.“ formulieren.
Empfehlung künstlicher numerischer Primärschlüssel
Es ist wahrscheinlich günstig, ausschließlich künstliche numerische Primärschlüssel (KNP s) zu verwenden, weil nur so deren Eindeutigkeit garantiert werden kann.
Namen der Spalte des Primärschlüssels
In diesem Kurs wird der Spalte mit dem Primärschlüssel oft derselbe Namen gegeben wie der Tabelle. Dies hat folgende Vorteile:
- Wenn immer diese Regel verwendet wird, dann muß man sich den Namen der Primärschlüsselspalte nicht extra merken.
- Dieses Benennungsschema paßt zur Verwendung der später vorgestellten natural joins und wird insofern von SQL selber nahegelegt.
Primärschlüssels in InnoDB
Bei Verwendung von InnoDB sollten Primärschlüssel nur kurz sein (was auch sonst empfehlenswert erscheint). Das heißt beispielsweise, daß ein Primärschlüssel eine Zahl oder ein kurzer Text sein sollte.
Kennzeichnung des Primärschlüssels
Es ist möglich und empfohlen, dem Datenbanksystem ausdrücklich mitzuteilen, daß eine Spalte den Primärschlüssel einer Tabelle enthalten soll. Hierzu wird dem Datentyp die Angabe »PRIMARY KEY« nachgestellt. Das Datenbanksystem stellt dann sicher, daß kein Wert in dieser Spalte mehrfach vorkommt, also daß der Primärschlüssel eindeutig eine bestimmte Zeile identifiziert.
- Konsole
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE ZETA
( ZETA VARCHAR ( 255 ) PRIMARY KEY,
IOTA VARCHAR ( 255 ) );INSERT INTO ZETA ( ZETA, IOTA ) VALUES ( '1', 'ANTON' );
INSERT INTO ZETA ( ZETA, IOTA ) VALUES ( '2', 'ANTON' );
SELECT * FROM ZETA;
+------+-------+
| ZETA | IOTA |
+------+-------+
| 1 | ANTON |
| 2 | ANTON |
+------+-------+2 rows in set
Die Kennzeichnung einer Primärschlüsselspalte kann auch am Ende der Liste der Spaltenfestlegungen hinter einem Komma erfolgen, indem der Spaltenname in runden Klammern hinter »PRIMARY KEY« geschrieben wird.
- Konsole
CREATE TABLE GAMMA
( GAMMA VARCHAR ( 255 ),
DELTA VARCHAR ( 255 ),
PRIMARY KEY( GAMMA ));Query OK, 0 rows affected
Die Angabe einer Einschränkung bei einer Spalte wird auch Spalteneinschränkung (column constraint ) genannt. Die Angabe einer Einschränkung für die Tabelle wird auch Tabellenvariableneinschränkung (table constraint ) genannt.
Tabellenvariableneinschränkungen können auch Einschränkungen ausdrücken, die mehrere Spalten gemeinsam betreffen, wie wir später sehen werden.
Primärschlüssel mit mehreren Spalten
Es ist auch möglich, einen Primärschlüssel mit mehreren Spalten festzulegen.
- Konsole
CREATE TABLE ALPHA
( GAMMA VARCHAR ( 255 ),
DELTA VARCHAR ( 255 ),
KAPPA VARCHAR ( 255 ),
PRIMARY KEY( GAMMA, DELTA ));Query OK, 0 rows affected
Ein Wert des Primärschlüssel in einer Zeile setzt sich dann aus den Werte seiner einzelnen Spalten in jener Zeile zusammen.
Die NULL-Integritätsregel lautet dann:
- In der Tabelle darf keine Spalte des Primärschlüssel irgendwo den Wert »NULL« enthalten.
DESCRIBE
In der folgenden Tabellenbeschreibung enthält die Spaltenbeschreibung der Primärschlüsselspalte in der Spalte »Key« das Kürzel »PRI«.
STADT
DESCRIBE ALPHA;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| GAMMA | varchar(255) | NO | PRI | NULL | |
| DELTA | varchar(255) | NO | PRI | NULL | |
| KAPPA | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
Übungsaufgaben (10')
/ Tabelle anlegen (5')
Für eine Tabelle mit den beiden Spalten »Kundennummer« und »Nachname« wird festgelegt:
- Die Kundennummer identifiziert eine Zeile und ist die Primärschlüsselspalte der Tabelle.
Legen Sie diese Tabelle mit MySQL an, wobei in der Aufgabenstellung fehlende Angaben von Ihnen festgelegt werden können.
Die Spalte mit der Kundennummer soll als Primärschlüssel gekennzeichnet werden.
Fügen Sie zwei Zeilen mit realistischen Nachnamen in die Tabelle ein. Versuchen Sie auch, Zeilen einzufügen, welche gegen die Integritätsregeln („Zu jedem Primärschlüsselwert darf es höchstens eine Zeile in der Tabelle geben“ und „In der Tabelle darf keine Zelle einer Primärschlüsselspalte den Wert »NULL« enthalten.“) verstoßen.
- Aussprachehinweis
- duplicate (a) ˈduːplɪkət
/ Tabelle anlegen (5')
Für eine Tabelle mit den beiden Spalten »Kursnummer« und »Personennummer« wird festgelegt:
- Die Kursnummer und die Personennummer gemeinsam identifizieren eine Zeile und bilden gemeinsam den Primärschlüssel der Tabelle.
Legen Sie diese Tabelle mit MySQL an, wobei in der Aufgabenstellung fehlende Angaben von Ihnen festgelegt werden können.
Beide Spalten zusammen sollen als Primärschlüssel gekennzeichnet werden.
Fügen Sie zwei Zeilen in die Tabelle ein, indem Sie beim Einfügen Werte für beide Spalten angeben. Versuchen Sie auch, Zeilen einzufügen, welche gegen die Integritätsregeln („Zu jedem Primärschlüsselwert darf es höchstens eine Zeile in der Tabelle geben“ und „In der Tabelle darf keine Spalte des Primärschlüssel irgendwo den Wert »NULL« enthalten.“) verstoßen.