Schlüssel: Unterschied zwischen den Versionen
Die Seite wurde neu angelegt: „Ein '''Schlüssel''' dient in einer relationalen Datenbank dazu, die Tupel (Datensätze) einer Relation (Tabelle) eindeutig zu identifizieren. Ein Schlüssel ist eine Gruppe von Spalten, die so ausgewählt wird, dass jede Tabellenzeile über den Werten dieser Spaltengruppe eine einmalige Wertekombination hat. == Superschlüssel == mini Bestimmen einige…“ |
|||
| (4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
Ein '''Schlüssel''' dient in einer [[Relationale Datenbank|relationalen Datenbank]] dazu, die [[ | Ein '''Schlüssel''' dient in einer [[Relationale Datenbank|relationalen Datenbank]] dazu, die [[Datensatz|Datensätze]] einer [[Datenbanktabelle]] eindeutig zu identifizieren. Ein Schlüssel ist eine Gruppe von Spalten, die so ausgewählt wird, dass jede Tabellenzeile über den Werten dieser Spaltengruppe eine einmalige Wertekombination hat. | ||
== Superschlüssel == | == Superschlüssel == | ||
| Zeile 16: | Zeile 16: | ||
== Primärschlüssel == | == Primärschlüssel == | ||
[[Datei:Schlüssel-SchlüsselInTabellen.png|mini]] | [[Datei:Schlüssel-SchlüsselInTabellen.png|mini]] | ||
Ein '''Primärschlüssel''' ist in einer [[Relationale Datenbank|relationalen Datenbank]] ein [[Schlüssel]] zur eindeutigen Identifizierung eines Datensatzes in einer [[Datenbanktabelle]]. | |||
* | |||
* | === Definition und Eigenschaften === | ||
* | [[Datei:Datenbanktabelle.jpg|mini]] | ||
Der Primärschlüssel (engl. ''primary key'') wird aus der Menge der Schlüsselkandidaten einer Tabelle ausgewählt und muss folgende Eigenschaften erfüllen: | |||
* '''Eindeutigkeit''': Jeder Wert des Primärschlüssels darf in der Tabelle nur einmal vorkommen | |||
* '''Nicht-NULL''': Der Primärschlüssel darf keinen NULL-Wert enthalten | |||
* '''Minimalität''': Der Primärschlüssel soll aus möglichst wenigen Attributen bestehen | |||
* '''Stabilität''': Die Werte des Primärschlüssels sollten sich während der Lebensdauer des Datensatzes nicht ändern | |||
=== Arten von Primärschlüsseln === | |||
==== Natürlicher Schlüssel ==== | |||
Ein natürlicher Schlüssel besteht aus Attributen, die bereits in den Geschäftsdaten vorhanden sind (z.B. Personalnummer, ISBN-Nummer). | |||
==== Künstlicher Schlüssel ==== | |||
Ein künstlicher Schlüssel wird speziell für die Datenbank erzeugt und hat keine natürliche Bedeutung in den Geschäftsdaten (z.B. automatisch generierte IDs). | |||
=== Bedeutung === | |||
Primärschlüssel sind fundamental für: | |||
* Gewährleistung der [[Datenintegrität]] | |||
* Aufbau von [[Beziehung (Datenbank)|Beziehungen]] zwischen Tabellen über [[Fremdschlüssel]] | |||
* Erstellung von [[Datenbankindex|Indizes]] für performante Datenabfragen | |||
* Vermeidung von Datenduplikaten | |||
=== Beispiel === | |||
In einer Tabelle "Mitarbeiter" könnte der Primärschlüssel so definiert werden: | |||
<syntaxhighlight lang="sql"> | |||
CREATE TABLE `mydb`.`Mitarbeiter` ( | |||
`idMitarbeiter` INT NOT NULL , | |||
`Vorname` VARCHAR(45) NULL , | |||
`Nachname` VARCHAR(45) NULL , | |||
`FKSalon` INT NOT NULL , | |||
PRIMARY KEY (`idMitarbeiter`) | |||
); | |||
</syntaxhighlight> | |||
== Fremdschlüssel == | == Fremdschlüssel == | ||
Ein '''Fremdschlüssel''' ist ein Attribut oder eine Attributkombination einer Relation, welches auf einen Primärschlüssel (bzw. Schlüsselkandidaten) einer anderen oder der gleichen Relation verweist. Er dient als Verweis zwischen zwei Relationen und zeigt an, welche Tupel | Ein '''Fremdschlüssel''' (engl. ''Foreign Key'') ist ein Attribut oder eine Attributkombination einer Relation (Tabelle), welches auf einen [[Primärschlüssel]] (bzw. Schlüsselkandidaten) einer anderen oder der gleichen Relation verweist. Er dient als Verweis zwischen zwei Relationen und zeigt an, welche Tupel (Datensätze) inhaltlich miteinander in Verbindung stehen. | ||
=== Zweck und Vorteile === | |||
Die Definition von Fremdschlüsseln ist essenziell für ein relationales Datenbankdesign. Sie ermöglicht es dem Datenbankmanagementsystem (DBMS): | |||
* Eingegebene Daten automatisch zu überprüfen und fehlerhafte Zuweisungen (z. B. auf nicht existierende Datensätze) abzulehnen und zu verwerfen. | |||
* Änderungen an verknüpften Tabellen durch kaskadierendes Löschen (''Cascaded Delete'') oder Aktualisieren (''Cascaded Update'') konsistent zu halten. | |||
* Spezifische Integritätsbedingungen (Constraints) direkt im Schema zu definieren. | |||
=== Referentielle Integrität === | |||
Die wichtigste Bedingung im Zusammenhang mit Fremdschlüsseln ist die '''referentielle Integrität''' (auch Beziehungsintegrität). Sie besagt, dass Attributwerte eines Fremdschlüssels zwingend auch als Attributwert des referenzierten Primärschlüssels vorhanden sein müssen. | |||
Über die referentielle Integrität kontrolliert das DBMS die Beziehungen zwischen Datensätzen. Werden dem System diese Beziehungen in der Struktur bekannt gemacht, ist es in der Lage, sie zu überwachen und so die Datenintegrität (Entitätenintegrität) sicherzustellen. | |||
'''Beispiel zur Überwachung:''' | |||
In einer Friseursalon-Datenbank gibt es eine Tabelle `mitarbeiter`, die über den Fremdschlüssel `idsalon` auf den Primärschlüssel der Tabelle `salon` verweist. | |||
* Ein neuer Mitarbeiter-Datensatz <code>{6, Müller, Klaus, 4}</code> würde die Integritätsbedingungen verletzen und vom DBMS '''zurückgewiesen''', wenn es gar keinen Salon mit der ID 4 gibt. | |||
* Ein bestehender Salon-Datensatz <code>{3, Kaiserschnitt}</code> ist hingegen unproblematisch, auch wenn noch kein Mitarbeiter auf diesen verweist. Ein Primärschlüssel darf von einem Fremdschlüssel referenziert werden, er muss es aber nicht. | |||
=== Umsetzung in DDL === | |||
Das Schema für Tabellen und ihre Beziehungen, einschließlich der Regeln zur referentiellen Integrität, wird in der [[Data Definition Language|DDL]] definiert. In SQL wird dies durch das Schlüsselwort <code>FOREIGN KEY</code> und <code>REFERENCES</code> umgesetzt. | |||
'''Beispiel eines Schemas in SQL:''' | |||
<syntaxhighlight lang="sql"> | |||
CREATE TABLE `salon` ( | |||
`idsalon` INT NOT NULL AUTO_INCREMENT, | |||
`name` VARCHAR(45) NOT NULL, | |||
PRIMARY KEY (`idsalon`) | |||
); | |||
CREATE TABLE `mitarbeiter` ( | |||
`idmitarbeiter` INT NOT NULL AUTO_INCREMENT, | |||
`nachname` VARCHAR(45) NOT NULL, | |||
`vorname` VARCHAR(45) NOT NULL, | |||
`idsalon` INT NOT NULL, | |||
PRIMARY KEY (`idmitarbeiter`), | |||
CONSTRAINT `fksalon` FOREIGN KEY (`idsalon`) | |||
REFERENCES `friseursalon`.`salon` (`idsalon`) | |||
ON DELETE NO ACTION ON UPDATE NO ACTION | |||
); | |||
</syntaxhighlight> | |||
== Künstlicher Schlüssel == | == Künstlicher Schlüssel == | ||