SQL Grundkurs 1: Die Sprache erlernen

PRIMARY KEY

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Der Primärschlüssel, eines der wichtigsten Elemente einer relationalen Datenbank, wird in einem Datenbanksystem über Constraint implementiert. Sehen Sie in diesem Film, wie Sie eine Tabelle mit einem Primärschlüssel erstellen.

Transkript

Wichtig ist es beim Erstellen einer Tabelle auch einen Primärschlüssel mit zu erstellen. Wie das geht, ist Thema dieses Films. Sie sehen hier eine CREATE TABLE-Anweisung vor sich, bei der noch kein Primärschlüssel definiert ist. Für die Tabelle "Schulung" ist eine ID definiert. Diese soll nun der Primärschlüssel werden. Eine Bezeichnung, eine Kategorie als Fremdschlüssel zu einer Kategorientabelle, eine Dauer, ein Verfügbarkeitsdatum, ein Preis und ob diese Schulung aktuell ist. Wir möchten nun für diese Schulung zusätzlich einen Primärschlüssel erzeugen. Prinzipiell kann ein Primärschlüssel schon beim Erzeugen der Tabelle selbst mit angelegt werden, oder auch danach mit einer ALTER TABLE-Anweisung. Wir wollen uns in diesem Video damit beschäftigen, wie bereits bei der Erstanlage der Tabelle der Primärschlüssel mit erstellt werden kann. Bei der einfachen Syntax wird lediglich in der Spalte, die den Primärschlüssel ausmacht, der Zusatz "PRIMARY KEY" ergänzt. Damit wird diese Spalte als Primärschlüssel definiert. Typischerweise ist es die erste in der Tabelle, muss aber gar nicht so sein, es könnte jede beliebige andere Position auch für einen Primärschlüssel verwendet werden. Aber es hat sich so eingebürgert, dass man eigentlich immer die erste Spalte als Primärschlüssel verwendet. Wenn ich nun diese Anweisung ausführe, dann haben wir diese erste Spalte schon als Primärschlüssel mit erzeugt. Das erkennen wir jetzt nicht nur hier in der Anzeige der Struktur, dass jetzt hier das Primärschlüssel-Symbol erkennbar wird. Wir merken das auch, wenn wir in die soeben erstellte Tabelle Zeilen einfügen, dass, wenn ich die gleiche Nummer in den Primärschlüssel noch einmal einfügen will, hier den Einser, ich schon zu einer PRIMARY KEY-Verletzung komme. Sie sehen hier in der Fehlermeldung "Verletzung der PRIMARY KEY-Einschränkung BK Schulung" und dann ein kryptischer Zusatz. Woran liegt das? Bei der einfachen Syntax wird der Name für dieses Objekt und ein "Constraint" ist immer ein eigenes Objekt, selbst vergeben, denn wir haben ja keinen definiert. Und der Name wird in der Fehlermeldung auch immer mit angezeigt. Man würde diesen Namen z.B. benötigen, um einen Primärschlüssel wieder zu entfernen. Wenn Sie die Struktur einer Datenbank also sauber erstellen möchten, dann empfehle ich Ihnen, den Namen schon bei der Erstellung mit anzugeben. Um Ihnen das zu zeigen, lösche ich die soeben erstellte Tabelle nochmals mit der Anweisung "DROP TABLE". Ich kopiere mir die ursprüngliche Anweisung und werde sie jetzt ergänzen. Ich habe jetzt zwei Möglichkeiten, den Primärschlüssel hier zu definieren von der Syntax her. Entweder auf Spaltenebene oder auf Tabellenebene. Was bedeutet das? Auf Spaltenebene bedeutet so wie wir es beim ersten Mal gemacht haben, dass der Primärschlüssel, oder auch ein anderes "Constraint", direkt bei der Spalte selbst definiert wird. Bei der erweiterten Syntax verwendet man den Zusatz "Constraint", und zwischen "Constraint" und dem "Constraint"-Typen wird ein Name vergeben. Aber es gibt natürlich Gepflogenheiten, und ich rate Ihnen, sich an diese zu halten. Diese Gepflogenheit besagt, dass man immer mit einem Präfix beginnt, der den "Constraint"-Typ beschreibt. Z.B. "PK" für "PRIMARY KEY", gefolgt von einem Unterstrich und dem Namen der Tabelle, in dem Fall "Schulung". Nachdem es ja nur einen Primärschlüssel pro Tabelle geben kann, und auch der Tabellenname eindeutig sein muss, ist automatisch auch der Name "PK_Schulung" innerhalb des verwendeten Schemas eindeutig. Wenn ich also auf diese Art und Weise den Primärschlüssel definiere, dann habe ich ihm jetzt sauber einen Namen gegeben. Wenn ich jetzt den Vorgang von vorhin wiederhole und diese Anweisung zweimal ausführe, um den Primärschlüssel-Verletzungsfehler zu provozieren, dann sehen wir, dass jetzt der sauberere, von uns vergebene "Constraint"-Name in der Fehlermeldung auftaucht. Ich habe soeben erwähnt, dass Sie einen "Constraint" auf Spaltenebene oder auf Tabellenebene definieren können. Ich lösche diese Tabelle abermals, um Ihnen nun auch zu zeigen, wie Sie auf Tabellenebene einen "Constraint" definieren. Auf Tabellenebene definiert bedeutet, dass nicht in der Zeile selber, in der die Spalte definiert wird, sondern am Ende nach der letzten Spalte ein "Constraint" festgelegt wird. D.h. aktuell ist die letzte Spalte, ich ergänze hier noch ein Komma und füge hier nun diese Anweisung ein. Einen einzigen Unterschied haben wir jetzt hier noch von der Syntax. Wenn ich das hier am Ende mache, dann muss ich natürlich noch zusätzlich dem System sagen, welche Spalte denn hier betroffen sein soll. Weil, vorher wusste das System deshalb, dass wir die ID als Primärschlüssel verwenden möchten, weil die Anweisung in der betreffenden Zeile gestanden ist, bei der Spaltendefinition. Jetzt haben wir es am Ende geschrieben. Jetzt müssen wir also in runder Klammer hinter dem "Constraint"-Namen angeben, welche Spalte hier gemeint ist. Nun führe ich diese Anweisung hier nochmals aus, und die Tabelle wurde erzeugt. Lassen Sie sich übrigens nicht von dieser roten Wellenlinie hier irritieren. Das kommt daher, weil ich hier eine CREATE TABLE-Anweisung mit demselben Tabellennamen mehrmals hintereinander im Script stehen habe, und der Editor nun glaubt, dass ich diese doppelt anlegen würde. Ich deaktiviere das mit einem "Go" dazwischen, damit unterbreche ich den Batch, und dem System sollte das üblicherweise jetzt egal sein. Aber, in dem Fall ist es ihm nicht, soll uns dann egal sein. Was ist jetzt ein weiterer Unterschied zwischen diesen beiden Varianten der Definition auf Spaltenebene oder auf Tabellenebene? Prinzipiell können Sie sich aussuchen, wo Sie den "Constraint" definieren. Auf Tabellenebene können Sie mehrere "Constraints" definieren, indem Sie nach einer Definition einfach wieder ein Komma eingeben und dann das nächste "Constraint" dranhängen. Der Unterschied ist der, dass Sie sich es prinzipiell aussuchen können. Wenn ein "Constraint" aber mehrere Spalten betrifft, dann kann es nur auf Tabellenebene definiert werden. Das ist z.B. der Fall, wenn Sie einen zusammengesetzten Schlüssel aus zwei Spalten definieren würden. Hier macht es keinen Sinn bei diesem Beispiel, aber hätte ich eine andere Aufgabenstellung, könnte ich hier z.B. mit Komma getrennt noch eine zweite Spalte, z.B. Kategorie, hier als Primärschlüssel-Definition ergänzen. Dann hätte ich einen zusammengesetzten Primärschlüssel erzeugt. Ich lösche das wieder, weil ich möchte das hier bei diesem Beispiel ja nicht tun. Ich wollte Ihnen hier nur die Syntax zeigen. Wenn Sie ein Primärschlüssel-"Constraint" bereits beim Erstellen der Tabelle mit erzeugen, kann der Zusatz "NOT NULL" hier jeweils entfallen. Das heißt, auch wenn Sie hier oder hier das "NOT NULL" nicht mit angeben, würde es funktionieren. "NOT NULL" ist nur dann notwendig, wenn das PRIMARY KEY-"Constraint" erst später mit einer eigenen Anweisung ergänzt werden würde. D.h., ich lösche noch einmal die Tabelle und führe die Anweisung ohne das "NOT NULL" aus, und es funktioniert gleichsam. Genau so, wenn ich die Anweisung auf Tabellenebene definiere. Zusätzlich könnten wir für den Primärschlüssel, sofern er numerisch ist wie in diesem Beispiel, auch definieren, dass er automatisch vergeben wird. Beim Microsoft SQL-Server passiert das über die "IDENTITY". Geben Sie "IDENTITY" nur so an, wird automatisch eine Schrittweite von "1" und ein Startwert "1" definiert. Sie können aber frei einen Startwert  - z.B. 1000, um vierstellig zu sein definieren und einen anderen Startwert als "1", z.B. "5". Dann würde als erstes 1000, dann 1005 und dann 1010 als Nummer vergeben werden. Sie können natürlich auch "1" als Schrittweite ergänzen. Wenn Sie nichts hinschreiben, wird auch "1" verwendet. Ich lösche noch einmal diese Tabelle, um sie abschließend noch einmal mit so einer "IDENTITY" zu erzeugen. Was ändert sich am Gezeigten, wenn Sie Oracle oder MySQL verwenden? Eigentlich nicht viel. Die Grundlogik ist ident. Bei Oracle können Sie auf die gleiche Art und Weise einen Primärschlüssel auf Spalten- oder auf Tabellenebene erzeugen. Hier ändert sich in der Syntax ja nichts. Bei MySQL gibt es eine Einschränkung, nämlich, dass die zuerst verwendete Variante nur funktioniert nämlich auf Spaltenebene wenn Sie die kurze Form "PRIMARY KEY" verwenden. Mit dem Zusatz "Constraint" und dem "Namen" können Sie bei MySQL nur operieren, wenn Sie es auf Tabellenebene am Ende definieren. Einen Unterschied gibt es noch bei MySQL: "IDENTITY" lautet dort nicht "IDENTITY", sondern "AUTO INCREMENT". Erzeugen wir also auch bei MySQL diese Tabelle mit einem Primärschlüssel mit dem Zusatz "AUTO_INCREMENT" und "PRIMARY KEY" kann ich das realisieren. Natürlich muss ich "INCREMENT" mit "C" und nicht mit "K" schreiben, damit es auch wirklich funktionieren wird. Natürlich funktioniert es nicht und erzeugt einen Fehler, wenn wir eine Tabelle mit "CREATE TABLE" erzeugen, die es bereits gibt. D.h. vom letzten Durchlauf habe ich diese Tabelle schon erstellt. Das heißt, ich lösche sie jetzt noch einmal vorweg, mit der Anweisung "DROP TABLE", um sie danach ein letztes Mal noch einmal neu zu erstellen. Und jetzt hat es funktioniert. "AUTO INCREMENT" ist bei MySQL fix auf den Startwert "1" und die Schrittweite "1" festgelegt. Sie haben in diesem Video nun gesehen, wie Sie beim Erzeugen einer Tabelle auch einen Primärschlüssel definieren können. Sie können einen Primärschlüssel bereits auf Spaltenebene mit definieren. Dann können Sie entweder die kurze Syntax verwenden, oder die ausführliche Syntax, bei der Sie den Namen für das "Constraint" mit angeben. Zweitere Variante wird in dieser Form bei MySQL nicht unterstützt. Sie können aber generell auch ein Primärschlüssel-"Constraint" auf Tabellenebene definieren. Das heißt, im Anschluss an die letzte Spalte, hinter einem Komma führen Sie die Definition an. Achten Sie dabei darauf, dass Sie zusätzlich den Namen der betroffenen Spalte ergänzen müssen. Wenn Sie ein "Constraint" erzeugen, auch ein "PRIMARY Constraint", das mehr als eine Spalte betrifft, z.B. einen zusammengesetzten Schlüssel, muss dieser auf Tabellenebene am Ende der Anweisung definiert werden. Wird ein Primärschlüssel schon beim Erzeugen der Tabelle definiert, kann das Angeben von "NOT NULL" für diese Spalte weggelassen werden.

SQL Grundkurs 1: Die Sprache erlernen

Arbeiten Sie sich in die Grundlagen der Datenbanksprache SQL am Beispiel von Microsoft SQL Server, Oracle und MySQL ein und lassen Sie sich die praktische Nutzung erklären.

14 Std. 40 min (112 Videos)
Derzeit sind keine Feedbacks vorhanden...

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!