| Home - SQL Befehle - Datenmanipulation - Objekt erzeugen | www.sqldocu.com | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| zurück | vor | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vorschriften werden mit dem Schlüsselwort CONSTRAINT (übersetzt: Zwang) erzeugt.
Meistens werden sie mit der/den Tabelle/Tabellen, auf die sie sich beziehen, definiert
(siehe
Tabellen erstellen).
Jede Vorschrift (CONSTRAINT) muss einen eindeutigen Namen innerhalb der
DB bzw. des
Schemas
erhalten.
Vorschriften werden hauptsächlich dazu verwendet, Daten einer DB konsistent zu halten.
Oft sind Tabellen von anderen abhängig. In unseren Beispiel Tabellen enthält die
Tabelle crew alle CrewMitglieder der Föderation. Zusätzlich wird für
jedes CrewMitgliede die Nummer des Raumschiffes abgespeichert, auf dem es arbeitet.
Jede Nummer ist in der Tabelle raumschiff der Name eines Raumschiffes
zugeordnet. Wird aus raumschiff ein Datensatz gelöscht, müssen die
Datensätze aller CrewMitglieder die sich auf den gelöschten Datensatz beziehen
ebenfalls geändert werden. Wie sie geändert werden hängt von der Implementierung
ab (z.B: betroffenen Datensätze werden ebenfalls gelöscht, oder sie erhalten
Nummer eines neuen Raumschiffes...).
Würde dies nicht geschehen so enthielten einige Datensätze in der Tabelle
crew Nummern von Raumschiffen, die in der Tabelle raumschiff nicht existieren.
Somit sind die Daten dieser beiden Tabellen nicht mehr konstisten. Wenn alle Daten
konsistent sind spricht man von
referenzieller Integrität.
CONSTRAINTS werden hauptsächlich verwendet um die referenzielle Integrität der Datensätze einer RDBMS zu gewährleisten. Leider wird der unten beschriebene Syntax (entspricht dem ANSI Standard) nicht von allen RDBMS unterstützt. In MySQL gibt es gravierende Abweichungen vom Standard. In den gezeigten Beispielen wird auf die Abweichungen von MySQL eingegangen.
Syntax ConstraintsBedingung
Syntax ReferenzBedingung
Hinweis:
Alle oben angeführten Optionen entsprechen dem ANSI Standard. Im Moment wird der beschriebene
Syntax nicht vollständig von RDBMS unterstützt. In MySQL gibt es gravierende
Abweichungen vom Standard. Wenn du CONSTRAINT mit MySQL verwenden möchtest solltest du
immer die aktuelle Version von MySQL verwenden. Beispiele:
CREATE TABLE meineTabelle1 (Spalte1 VARCHAR(255), Spalte2 INTEGER)
CREATE TABLE root.meineTabelle1 (Spalte1 INTEGER) CREATE TABLE meineTabelle1 ( Spalte1 INTEGER NOT NULL, Spalte2 DECIMAL(7,2), CONSTRAINT meinConstraint1 PRIMARY KEY (Spalte2,Spalte4), CONSTRAINT meinConstraint2 FOREIGN KEY REFERENCES meineTabelle2(Spalte3) )
Diese Tabellen werden verwendet um SQL besser darstellen zu können.
TabelleName: crew
TabelleName: raumschiff status=0 —> Raumschiff einsatzbereit status=1 —> Raumschiff in Reparatur
CREATE TABLE crew ( name VARCHAR(255), nr_schiff INTEGER, CONSTRAINT pruefe_nummer CHECK (nr_schiff >0) )
Es wird eine Tabelle mit dem Namen crew erzeugt.
Mit crew wird eine Vorschrift mit dem Namen pruefe_nummer
angelegt. pruefe_nummer stellt sicher, dass in der Spalte
nr_schiff keine negativen Werte gespeichert werden können.
Die CHECK Bedingung kann beliebig erweitert werden:
PHP Syntax
PERL Syntax
z.B: CHECK (nr_schiff > 0 AND nr_schiff < 100) (siehe Vergleichsopterationen). CHECK Constraints können dafür verwendet werden, Wertebereiche von Spalten einzuschränken, nur bestimmte Werte zu zulassen usw. Hinweis: MySQL unterstützt keine CHECK Constaints!
CREATE TABLE crew ( name VARCHAR(255), nr_schiff INTEGER, CONSTRAINT name_index UNIQUE (name) )
Es wird eine Tabelle mit dem Namen crew erzeugt.
Mit crew wird eine Vorschrift mit dem Namen name_index
angelegt. name_index stellt sicher, dass in der Spalte
name kein Wert mehrfach vorkommt. Leere Felder sind in der Spalte
name erlaubt.
PHP Syntax
PERL Syntax
CREATE TABLE crew ( name VARCHAR(255), nr_schiff INTEGER, CONSTRAINT name_index PRIMARY KEY (name) )
Es wird eine Tabelle mit dem Namen crew erzeugt.
Mit crew wird eine Vorschrift mit dem Namen name_index
angelegt. name_index stellt sicher, dass in der Spalte
name kein Wert mehrfach vorkommt. Leere Felder sind in der Spalte
name nicht erlaubt.
PHP Syntax
PERL Syntax
Für PRIMARY KEY können auch mehrere Spalten herangezogen werden. Der Datensatz des PRIMARY KEYs setzt sich in diesem Fall aus den verwendeten Spalten zusammen. Jeder Datensatz muss wiederum eindeutig sein.
FOREIGN KEY CONSTRAINTS werden verwendet um die
referenzielle Integrität
von
DB (SCHEMA)
zu gewährleisten (siehe
Beschreibung).
In unseren Beispiel enthält die Tabelle crew alle CrewMitglieder der
Föderation. Zusätzlich wird in der zweiten Spalte für jedes CrewMitgliede die
Nummer des Raumschiffes abgespeichert, auf dem es arbeitet.
Die Tabelle raumschiff besteht aus 3 Spalten. Die erste Spalte enthält
die Nummer des Raumschiffs, die zweite Spalte enthält den Namen des Raumschiffs
und die dritte Spalte ist hier nicht von Belang.
PHP Syntax
PERL Syntax
Man erkennt die erste Spalte der Tabelle raumschiff und die zweite Spalte der Tabelle crew miteinander korrelieren. Wird aus der Tabelle raumschiff ein Datensatz (Raumschiff mit entsprechender Nummer) gelöscht, muss in der Tabelle crew jeder Datensatz (CrewMitglied das auf dem "gelöschten" Raumschiff gearbeitet hat) der auf den gelöschten Datsatz referenziert, geändert werden. Die Tabelle crew hängt somit von der Tabelle raumschiff ab. Man bezeichnet daher die Tabelle raumschiff als PARENT TABLE (Eltern Tabelle) und die Tabelle crew als CHILD TABLE (Kind Tabelle). Aus Sicht der Tabelle raumschiff ist die zweite Spalte der Tabelle crew ein Fremdschlüssel (übersetzt: FOREIGN KEY). Durch das Anlegen des FOREIGN KEYs ist es nicht möglich, ein Raumschiff in der Tabelle raumschiff zu löschen, solange CrewMitglieder in der Tabelle crew existieren, die auf diesem Raumschiff arbeiten. Einiges ist beim Anlegen eines FOREIGN KEYs zu beachten:
Die Option ON DELETE ermöglicht es festzulegen, welche Aktion das RDBMS durchführt wenn in der PARENT Tabelle ein Datensatz (hier: Raumschiff mit Nummer) gelöscht wird. Die Option ON UPDATE ermöglicht es festzulegen, welche Aktion das RDBMS durchführt wenn in der PARENT Tabelle ein Datensatz (hier: Raumschiff mit Nummer) geändert wird. Folgende Aktionen sieht der ANSI Standard vor:
MySQL unterstützt im Moment die Option FOREIGN KEY nicht. In Zukunft will MySQL diese Option implementieren. Ansätze sind bereits vorhanden. Um Source Code möglichst Plattform unabhängig programmieren zu könnnen, akzeptieren die neusten Versionen der MySQL Compiler die Option FOREIGN KEY. Jedoch bewirkt diese Option in MySQL derzeit nichts. MySQL Syntax (wird von MySQL Compiler akzeptiert, bewirkt jedoch nichts). CREATE TABLE raumschiff ( nr_schiff INTEGER NOT NULL, name VARCHAR(255), status INTEGER UNSIGNED, CONSTRAINT raumschiff_pk PRIMARY KEY (nr_schiff) ) TYPE=INNODB CREATE TABLE crew ( name VARCHAR(255), nr_schiff INTEGER, INDEX nr_schiff_index (nr_schiff), CONSTRAINT crew_fk FOREIGN KEY (nr_schiff) REFERENCES raumschiff(nr_schiff) ) TYPE=INNODB
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||