30
151 4 Datendefinition in SQL SQL hat sich als Standardabfragesprache für relationale Datenbanken etabliert. SQL steht ursprünglich für »Structured Query Language«. Die ersten Versuche dazu wurden in den IBM-Labors vorgenommen und daraus ist die Vorläuferspra- che SEQUEL entstanden. SQL stellt die Schnittstelle zwischen der relationalen Datenbank und dem Anwendungsprogramm dar. Die Sprache ist in erster Linie nicht für Endanwender gedacht, sondern für Systementwickler. Mit SQL lassen sich alle Operationen der Relationenalgebra realisieren, die in Kapitel 3 eingeführt worden sind. 4.1 SQL und SQL-Standard 4.1.1 Ein kleiner Überblick über die Historie von SQL 1974 D. Chamberlain et. al. definieren SEQUEL. 1977 Revision: SEQUEL/2; IBM-Prototyp System R. 1977 Oracle beginnt mit der Implementierung von SEQUEL auf Mainframes. 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor. 1985 Ingres stellt auf SQL um. Informix stellt auf SQL um. 1986 Sybase wird ausgeliefert. 1986 X/OPEN entscheidet sich für SQL. 1987 Der Standard ISO 9075 Database Language SQL (SQL-86) wird veröffent- licht. 1988 dBASE IV erhält SQL als Abfrage-Sprache. Adabas erhält SQL. 1989 ISO 9075 Database Language SQL with Integrity Enhancement (SQL-89) wird veröffentlicht. SESAM und UDS erhalten SQL.

4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

Embed Size (px)

Citation preview

Page 1: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

151

4 Datendefinition in SQL

SQL hat sich als Standardabfragesprache für relationale Datenbanken etabliert.SQL steht ursprünglich für »Structured Query Language«. Die ersten Versuchedazu wurden in den IBM-Labors vorgenommen und daraus ist die Vorläuferspra-che SEQUEL entstanden. SQL stellt die Schnittstelle zwischen der relationalenDatenbank und dem Anwendungsprogramm dar. Die Sprache ist in erster Linienicht für Endanwender gedacht, sondern für Systementwickler. Mit SQL lassensich alle Operationen der Relationenalgebra realisieren, die in Kapitel 3 eingeführtworden sind.

4.1 SQL und SQL-Standard

4.1.1 Ein kleiner Überblick über die Historie von SQL

1974 D. Chamberlain et. al. definieren SEQUEL.

1977 Revision: SEQUEL/2; IBM-Prototyp System R.

1977 Oracle beginnt mit der Implementierung von SEQUEL auf Mainframes.

1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus.

1981 IBM liefert SQL/DS aus.

1983 IBM stellt DB2 vor.

1985 Ingres stellt auf SQL um.Informix stellt auf SQL um.

1986 Sybase wird ausgeliefert.

1986 X/OPEN entscheidet sich für SQL.

1987 Der Standard ISO 9075 Database Language SQL (SQL-86) wird veröffent-licht.

1988 dBASE IV erhält SQL als Abfrage-Sprache.Adabas erhält SQL.

1989 ISO 9075 Database Language SQL with Integrity Enhancement (SQL-89)wird veröffentlicht.SESAM und UDS erhalten SQL.

Page 2: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

4 Datendefinition in SQL

152

Zwischen dem SQL-Standard und den in kommerziell verfügbaren Datenbanksys-temen angebotenen SQL-Implementierungen gibt es Differenzen in beiden Rich-tungen. Teilweise übersteigt der verfügbare Sprachumfang die Forderungen derNorm, teilweise werden Forderungen der SQL-Norm nicht erfüllt. Es ist abergrundsätzlich zu erkennen, dass die Hersteller sich mehr und mehr um die Einhal-tung des SQL-Standards bemühen.

Die Standardisierung von SQL ist aus folgenden Gründen wichtig:� Verschiedene RDBMs können nebeneinander im Betrieb existieren. Die Anwen-

dungsentwicklung und Datenbankadministration sollten möglichst wenig von-einander abweichen.

� Anwendungen sollen portabel sein, damit man beispielsweise auf ein leis-tungsfähigeres DBMS umsteigen kann oder damit die Anwendungsentwick-lung in einer anderen Umgebung erfolgen kann als der produktive Einsatz.

� Herstellerunabhängigkeit ist gefordert.� Die Verfügbarkeit von »Front-Endsystemen«, also Programmen, die hersteller-

unabhängig auf Datenbanken zugreifen können, nimmt zu.� In Client-Server-Umgebungen kommuniziert die Anwendersoftware über

Schnittstellen mit dem DBMS.� Bei der Anwendungsentwicklung mit CASE-Tools erfolgt die Festlegung von

Daten- und Programmstrukturen über weite Strecken unabhängig vom einge-setzten DBMS.

4.1.2 Elemente von SQLDie Sprachelemente von SQL lassen sich in zwei Kategorien unterteilen, die aller-dings im Standard nicht festgeschrieben sind:

1992 ISO 9075 Database Language SQL (SQL2 oder SQL-92) wird veröffent-licht.

1993 RDA-Standard (Remote Data Access) der Database Access Group (z.B.Microsoft ODBC) wird veröffentlicht.

1996 SQL/PSM (Persistent Stored Modules); Datenbankprozeduren werdennormiert (vgl. Kapitel 7.3).

1999 SQL:1999 wird veröffentlicht und löst damit SQL-92 ab.

2003 Eine abermals überarbeitete und teilweise neu strukturierte VersionSQL:2003 löst SQL:1999 ab. Zum Zeitpunkt der Drucklegung diesesBuchs befindet sich die neue Norm aber noch im Entwurfsstadium undwird von Pessimisten (oder Realisten) als SQL:200n bezeichnet.

Page 3: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

SQL und SQL-Standard

153

DDL (Data Definition Language)

Hierzu gehören:� Anweisungen zur Anlage und Verwaltung von Schemata (Zusammenfassung

von Tabellen, Datensichten etc.), für die ein bestimmter Benutzer zuständig ist� Anweisungen zur Definition von Domänen� Anweisungen zur Definition von Relationen einschließlich der dazugehörigen

Konsistenzbedingungen� Anweisungen zur Anlage von Datensichten (Views)� Die Verwaltung von Benutzern und deren Datenzugriffsrechten

DML (Data Manipulation Language)

Die DML enthält Anweisungen zur:� Eingabe von Daten in eine vorhandene Tabelle� Änderung von Daten in einer Tabelle� Löschung von Daten in einer Tabelle� Abfrage von Daten, die auch mehrere Tabellen umfassen können

und Anweisungen zur:� Definition und Steuerung von Transaktionen

Weiterhin gehören zum Sprachumfang kommerziell verfügbarer relationalerDatenbanksysteme Anweisungen, die die interne Organisation der Datenbankensteuern. Sie sind syntaktisch meist an SQL-Anweisungen angelehnt, unterliegenaber nicht der Norm, da diese sich nicht auf das interne Schema einer Datenbankbezieht. Dazu gehören:� Anweisungen zur Definition von Indexen� Erweiterungen der CREATE TABLE-Anweisung im Hinblick auf Varianten der

Ablage auf dem Speichermedium (beispielsweise in »Clustern«)1

SQL ist nicht-prozedural

Die gewünschten Daten werden unter SQL durch Prädikate (logische Bedingun-gen) charakterisiert. Entscheidend für das Auffinden der Daten, die man ansehenoder verändern will, ist ihre Beschreibung über Attributwerte – wie kompliziertdiese auch immer sein mag. Ein Beispiel: Zeige von allen Kunden, deren WohnortKayhude ist und die zugleich Stammkunden sind, Kunden_nr, Name und Ort an.Der »Weg« zu den Daten in Form von Suchalgorithmen etc. wird bei SQL nichtangegeben. Deshalb ist der Befehl zu obigem Beispiel relativ nahe an derumgangssprachlichen Formulierung:

1 Das beispielsweise bei ORACLE vorhandene Cluster-Konzept sieht die Speicherung von Tu-peln verschiedener Tabellen, die häufig miteinander verbunden werden, physikalisch benach-bart auf den Plattensektoren vor, um damit die Anzahl der Zugriffe zu reduzieren.

Page 4: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

4 Datendefinition in SQL

154

SELECTkunden_nr, name, ortFROM kundeWHERE ort = 'Kayhude' AND status = 'S';

Auch höchst komplexe Abfragen können so gestellt und beantwortet werden, z.B.:»Zeige alle Kunden, die zwischen dem 1.3.2003 und dem 31.3.2003 einen Umsatz vonmehr als 100 Euro gemacht haben, wobei sie aber keinen Tee gekauft haben dürfen und imVorjahr auch schon einmal etwas bestellt haben müssen.«2

SQL verarbeitet grundsätzlich Mengen von Tupeln. Eine Abfrage wie die obige hateine Tabelle mit keiner, einer oder beliebig vielen Zeilen als Ergebnis.3 Dies unter-scheidet SQL von imperativen Programmiersprachen, die satzweise arbeiten, d.h.mit einer Anweisung immer nur einen Datensatz zugleich lesen, schreiben, löschenoder vergleichen können. SQL orientiert sich an der Relationenalgebra. Es mussaber deutlich festgehalten werden, dass SQL nicht mit Relationen, sondern mitTabellen arbeitet. Relationen sind nurmehr ein Spezialfall von Tabellen. Wir habenin Kapitel 3 gezeigt, dass die Relationenalgebra mit wenigen Modifikationen aufTabellen anwendbar ist.4 Es ist in SQL auch jederzeit möglich, eine Datenabfrage sozu formulieren, dass das Ergebnis eine Relation ist, also keine mehrfach vorkom-menden identischen Tupel enthält. Seit 1999 verarbeitet SQL außer Tabellen auchStrukturen, die als objektrelational bezeichnet werden und für die einige Ein-schränkungen, wie wir sie in Kapitel 3 formuliert haben, nicht gelten. Mehr dazufindet sich in Kapitel 9.

Wir beziehen uns im Wesentlichen auf SQL im Sinne des Standards SQL:200n aufdem Stand von August 2002 (Draft Version). Da zum Zeitpunkt der Manuskripter-stellung kein DBMS verfügbar ist, das den Standard vollkommen erfüllt, wirdgegebenenfalls auf Abweichungen und Besonderheiten bei existierenden DBMS(Sybase, ORACLE, etc.) hingewiesen.

4.2 SchemadefinitionEin SQL-Schema enthält Datenbankobjekte eines einzelnen Benutzers5 innerhalbeiner Datenbank. Dazu gehören unter anderem von ihm erzeugte Basistabellen,

2 Wir empfehlen dieses Beispiel hier nicht als Übung.3 Zur Unterscheidung der Begriffe Tupel, Zeile, Attribut, Spalte, Relation und Tabelle vgl. Ab-

schnitt 2.1.4 Näheres findet sich in Kapitel 2.6.5 Unter einem Benutzer verstehen wir einen in der Datenbank namentlich eingetragenen, mit be-

stimmten Zugriffsrechten ausgestatteten Anwender der Datenbank. Benutzer und Person sindnicht unbedingt identisch. Einer Person können je nach Anwendungszusammenhang ver-schiedene Benutzernamen zugeordnet sein, beispielsweise einer für die Rolle als Datenbank-administrator und ein anderer für die normale Nutzung der Datenbank. Umgekehrt kann esmanchmal organisatorisch sinnvoll sein, einen Benutzernamen (z.B. GAST) einzurichten, un-ter dem sich verschiedene Personen anmelden können, um allgemein zugängliche Informa-tionen abzufragen (Auskunftsysteme).

Page 5: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

DDL: Datendefinition mit SQL

155

Datensichten und Integritätsbedingungen.6 Jedes Datenbankobjekt gehört zugenau einem Schema, und jedes Schema gehört genau einem Benutzer. Ein Benut-zer kann aber Eigentümer mehrerer Schemata sein. Datenbankobjekte müsseninnerhalb eines Schemas eindeutige Namen haben. Das bedeutet, dass in einerDatenbank mehrere Schemata gleichzeitig existieren können und dass gleichna-mige Datenbankobjekte in verschiedenen Schemata auftreten können.

Die Anweisung zur Anlage eines Schemas lautet in etwas vereinfachter Form:

CREATE SCHEMA schema AUTHORIZATION benutzer

Es folgen dann die Definitionsanweisungen zur Erzeugung beliebig vieler Daten-bankobjekte innerhalb des neuen Schemas, das sind beispielsweise CREATE DOMAIN,CREATE TABLE, CREATE VIEW in beliebiger Anzahl und Reihenfolge. Diese Anweisun-gen werden in den folgenden Abschnitten beschrieben.

Zur Schemadefinition muss gesagt werden, dass zurzeit die meisten Datenbank-systeme diese Anweisung nicht zur Verfügung stellen. Oft wird gar nicht logischzwischen Datenbank und Schema unterschieden, und die Anlage einer Datenbankerfolgt nicht über eine SQL-Anweisung, sondern über spezielle Hilfsprogramme,mit denen dann auch gleich noch Details der internen Ebene wie Name und Größeder Plattendatei festgelegt werden.

4.3 DDL: Datendefinition mit SQL Eine zentrale Forderung an eine relationale Datendefinitionssprache ist die Unter-stützung von Integritätsbedingungen. SQL unterstützt Schlüssel (Primär- undKandidatenschlüssel), Fremdschlüssel und so genannte »Geschäftsregeln« – dassind Integritätsregeln, die sich durch logische Bezüge von Daten auf andere Datenergeben. Für die Zuverlässigkeit der Daten ist beispielsweise die Eineindeutigkeitaller Primär- und Kandidatenschlüsselwerte unverzichtbar – wie sollen wir sonsteinen bestimmten Kunden identifizieren? Wir stellen die entsprechenden Sprach-elemente in diesem Kapitel vor. Seit 1992 wird eine rudimentäre Form von benut-zerdefinierten Datentypen (»Domänen«7) unterstützt. SQL:2003 enthält auchobjektorientierte Elemente, die die so genannten »objektrelationalen Datenban-ken« charakterisieren sollen. Dazu gehört die Möglichkeit, »echte« benutzerdefi-nierte Datentypen inklusive Zugriffsmethoden und Vergleichsoperatoren zuerzeugen. Wir kommen auf diese Erweiterungen in Kapitel 9 zurück.

Allgemein gilt, dass die Erzeugung neuer Datenbankobjekte mit dem Schlüssel-wort CREATE eingeleitet wird. Anweisungen zur Entfernung von Datenobjektenbeginnen mit dem Schlüsselwort DROP8.

6 Der Begriff »Datenbankobjekt« darf nicht mit dem Objektbegriff der objektorientierten Daten-bankmodelle verwechselt werden (vgl. Kapitel 9).

7 Sie erfüllen aber nur einenTeil des im Abschnitt 2.1.2 eingeführten Domänenkonzeptes.8 Wird in 4.3.7 kurz behandelt.

Page 6: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

4 Datendefinition in SQL

156

4.3.1 Datentypen und Domänen

Eine Domäne ist vom theoretischen Konzept her die Menge zulässiger Werte, dieein Attribut in einer Relation annehmen kann, verbunden mit einer Menge anOperationen, die innerhalb der Wertemenge oder in Verbindung mit anderen Wer-temengen ausgeführt werden kann.9

CREATE DOMAIN gehört zum Datendefinitionsteil von SQL. Die Syntax lautet in derGrundform:10

CREATE DOMAIN domänenname [AS] datentyp [default] [bedingung]

Die Domänendefinition wird im Datenwörterbuch abgelegt. Jede Domäne musseinen eindeutigen Namen erhalten. Die Bedingung, die den Wertebereich ein-schränkt, wird durch eine CHECK-Klausel definiert, in der eine Suchbedin-gung wie in der WHERE-Klausel der SELECT-Anweisung angegeben wird.Dabei kann beispielsweise auch festgelegt werden, ob Nullmarken zulässigsind. Wir sind allerdings der Auffassung, dass diese Festlegung gar nicht derDomäne selbst zukommt, wenn diese eine Wertemenge beschreibt. NULL ist keinWert und kann daher auch nicht Element einer Wertemenge sein. Nullmarkenzuzulassen ist eine Frage der Attributdefinition. Dabei können für Attribute, diesich auf dieselbe Domäne beziehen, auch unterschiedliche Festlegungen getrof-fen werden. Eine Kundennummer als Primärschlüssel darf keine Nullmarkeenthalten, dasselbe ist für Fremdschlüssel aber in bestimmten Fällen durchausdenkbar.

Aus einem ähnlichen Grund gehört auch die Default-Klausel eigentlich nicht indie Domänendefinition, sondern in die Spaltendefinition einer Tabelle mit CREATETABLE. Verschiedene Spalten können derselben Domäne angehören, aber unter-schiedliche Vorgabewerte haben. Der SQL-Standard trifft unseres Erachtens denSinn der Sache hier nicht. Domänen sind hier letztlich nicht mehr als eine Abtren-nung von Elementen der Spaltendefinition (CHECK), auf die von mehreren Spal-ten aus Bezug genommen werden kann.11

Das Problem der erlaubten und verbotenen Operationen ist nicht Bestandteil derCREATE DOMAIN-Anweisung, sondern wird im Standard unter dem Titel »Abs-trakte Datentypen« behandelt. Wir erläutern dieses Konzept in Kapitel 9.

9 Vergleiche Abschnitt 2.1.2.10 Die formale Syntaxbeschreibung ist im Anhang A beschrieben.11 Melton, Mitglied des Standardisierungskomitees, sagt dazu: »'We were once fans of SQL's

domain capabilities. However, they have proved to be less useful than originally hoped, andfuture editions of the SQL standard may actually delete the facility entirely.« [Melt02 S. 98]

Page 7: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

DDL: Datendefinition mit SQL

157

Beispiele für Domänendefinitionen: 12

CREATE DOMAIN Kunden_key AS INTEGER CHECK (VALUE > 100);CREATE DOMAIN Kunden_status AS CHAR(1) CHECK (VALUE IN ('W', 'G', 'S'));-- 'W': Werbemaßname - noch nicht als Kunde aufgetreten-- 'G': Gelegenheitskunde-- 'S': StammkundeCREATE DOMAIN Zahlungsart AS CHAR(1) CHECK (VALUE IN ('R', 'B', 'N', 'V', 'K')) DEFAULT 'N';-- 'R': Rechnung-- 'B': Bankeinzug-- 'N': Nachnahme-- 'V': Vorkasse-- 'K': Kreditkarte

Auf diese Festlegung kann bei der Tabellendefinition zurückgegriffen werden. Füreine Spalte, die ihre Werte aus einer definierten Domäne bezieht, ersetzt die Nen-nung der Domäne dann die Typangabe.

Beispiel:

CREATE TABLE kunde ( kunden_nr Kunden_Key NOT NULL status Kunden_Status, zahlung Zahlungsart, ... );

Sybase Adaptive Server Anywhere realisiert Domänen entsprechend dem Standard.Statt des Schlüsselworts VALUE, das beim Standard für den Zugriff auf den Wertanzuwenden ist, muss man dort einen beliebigen Bezeichner mit vorangestelltem @einsetzen. Wir verwenden im Folgenden in Anlehnung an den Standard jeweilsden Bezeichner @VALUE.

12 Im SQL-Standard ist nicht geregelt, ob SQL-Anweisungen durch ein Satzzeichen abgeschlos-sen werden müssen. In den verschiedenen interaktiven SQL-Systemen (ISQL) hat sich das Se-mikolon als abschließendes oder als trennendes Satzzeichen etabliert. Wir werden im Folgen-den SQL-Anweisungen jeweils durch ein Semikolon abschließen. Die Zeichen -- bedeuten,dass der Rest der Zeile ein Kommentar ist.

Page 8: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

4 Datendefinition in SQL

158

-- Domaindefinition in Sybase SQLCREATE DOMAIN Kunden_status AS CHAR(1) CHECK (@VALUE IN ('W', 'G', 'S'));

Die Anweisung CREATE DISTINCT TYPE erreicht, dass Attribute nur dann direkt ver-gleichbar sind, wenn sie demselben DISTINCT TYPE angehören. Beispielsweise istein Vergleich von Kundennummern mit Bestellnummern dann nicht ohne weiteresmöglich. Dies macht ja auch in der Regel keinen Sinn und ist meistens das Ergebniseiner Verwechslung von Attribut-Bezeichnern. Die Definition eines DISTINCTTYPE schließt aber wiederum keine Einschränkung eines Wertebereichs ein.

Beispiel:

CREATE DISTINCT TYPE typ_kunden_nr AS INTEGER

Falls doch ausnahmsweise so ein Vergleich vorgenommen werden soll, ist dasdurch explizite Konvertierung auf den Ursprungstyp zu formulieren, was mit derCAST-Anweisung geschehen kann.

Beispiel:

CAST(kunden_nr AS INTEGER)

DB2 implementiert dieses Konzept.

4.3.2 Datentypen in SQLEs gibt die im Folgenden angegebenen Datentypen in SQL. Die Skalierungsgrößenin der Klammer hinter dem Datentyp können in der Regel weggelassen werden. Eswerden dann Standardwerte eingesetzt, die bei numerischen Datentypen imple-mentationsabhängig sind, bei Zeichen- und Bitketten jeweils 1, bei TIME 0 (d.h.keine Unterteilung der Sekunde) und bei TIMESTAMP 6 (d.h. Genauigkeit auf Mikro-sekunden).

Exakt numerisch

INTEGER üblicherweise vier Byte

SMALLINT üblicherweise zwei Byte

BIGINT mindestens so groß wie INTEGER

NUMERIC(p,q) Dezimalzahlen mit genau p Stellen, davon q hinter dem Dezimalpunkt

DECIMAL(p,q) Dezimalzahlen mit mindestens p Stellen, davon q hinter dem Dezimal-punkt

Page 9: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

DDL: Datendefinition mit SQL

159

Angenähert numerisch

Zeichenketten

Jede Zeichenkette hat eine bestimmte Länge, wobei diese Länge nicht immer dieAnzahl der Bytes sein muss. Bei nationalen Zeichensätzen tritt eine Reihe von Prob-lemen auf, zum Beispiel:� Im Deutschen bilden ä, ö, ü jeweils einen Buchstaben, der aber bei der Sortie-

rung in Namensverzeichnissen jeweils wie ae, oe, ue zu behandeln ist.� Im Spanischen gelten ch und ll (wie auch ñ) jeweils als ein Zeichen, das nach c, l

(bzw. n) einzusortieren ist.

Bitketten

Bitketten dienen in erster Linie als Behälter für Objekte, die nicht vom DBMS inter-pretiert werden (wie Bilddaten, Zeichnungselemente, Font-Daten). Die Typen BITund BIT VARYING sind aus dem Standard entfernt worden. Es gibt nurmehr einenTyp für große Bitmuster wie beispielsweise Bilder, Töne, Zeichnungen, derenBedeutung dem DBMS nicht bekannt ist, die es also als »unstrukturierte Daten«behandelt.

REAL Gleitpunktzahlen, einfache Genauigkeit

DOUBLE PRECISION Gleitpunktzahlen, doppelte Genauigkeit

FLOAT(p) Gleitpunktzahlen, mindestens p Stellen Genauigkeit

CHARACTER(n) Zeichenketten mit genau n Zeichen

CHARACTER VARYING(n) Zeichenketten mit höchstens n Zeichen

VARCHAR Synonym zu CHARACTER VARYING

NATIONAL CHARACTER(n) Zeichenketten mit genau n Zeichen mit nationalen Besonder-heiten wie z.B. Zeichensatz, Sortierreihenfolge

NATIONAL CHARACTER VARYING(n)

Zeichenketten mit höchstens n Zeichen mit nationalen Besonderheiten

CHARACTER LARGE OBJECT (n)

Große Textobjekte. Die maximal mögliche Länge ist im-plementationsabhängig. Zur Spezifikation großer Längen können die Abkürzungen K (Kilo), M (Mega), G (Giga) verwendet werden.

CLOB Synonym zu CHARACTER LARGE OBJECT

Page 10: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

4 Datendefinition in SQL

160

Datum und Uhrzeit:

Logischer Datentyp

In der Praxis sind boolesche Variablen unverzichtbar. Jedes Prädikat (WHERE-Klausel) ist schließlich ein boolescher Wert. In Programmiersprachen werden boole-sche Ausdrücke benutzt, um Verzweigungen zu bearbeiten (IF ... THEN ... ELSE).Einige, aber längst nicht alle Datenbanksysteme bieten einen solchen Typ für logi-sche Daten bereits an. Umso erstaunlicher ist es, dass es bis 1999 gedauert hat, bisder Datentyp BOOLEAN in SQL Einzug gehalten hat.

BINARY LARGE OBJECT (n)

Binäre Daten mit einer maximalen Länge entsprechend n Zei-chen

BLOB(n) Synonym zu BINARY LARGE OBJECT

DATE Kalenderdaten vom Jahr 1 bis zum Jahr 9999

TIME(p) Uhrzeit in Stunden, Minuten, Sekunden, wobei die Sekunden noch p Stellen nach dem Komma haben

TIMESTAMP(p) Datum und Uhrzeit

TIME(p) WITH TIME ZONE Die Angabe einer Zeitzone ist die Abweichung von der UCT (Zeitzone von London, früher »GMT« genannt). Wegen der Sommerzeit kann sie zwischen -11:59 und +13:00 liegen. MEZ ist UCT +1:00, MESZ = UCT + 2:00.

TIMESTAMP(p) WITH TIME ZONE

Datum und Uhrzeit mit Zeitzone

INTERVAL YEAR Datumsdifferenz in Jahren

INTERVAL YEAR TO MONTH Datumsdifferenz in Jahren und Monaten

INTERVAL DAY Zeitdifferenz in Tagen

INTERVAL DAY TO HOUR Zeitdifferenz in Tagen und Stunden

INTERVAL DAY TO MINUTE

Zeitdifferenz in Tagen, Stunden, Minuten

INTERVAL MINUTE TO SECONDS (6)

Zeitdifferenz in Minuten und Mikrosekunden

BOOLEAN Wahrheitswerte TRUE und FALSE sowie UNKNOWN

Page 11: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

DDL: Datendefinition mit SQL

161

Leider fehlt bei den Datenbanksystemen häufig der boolesche Datentyp. In diesemFall kann man sich notdürftig mit CHAR oder INTEGER behelfen, wobei bei-spielsweise 0 als FALSE und 1 als TRUE interpretiert wird. Diese Interpretationsollte dann dokumentiert und durchgehend eingehalten werden. Wir können aufdiese Weise auch eine Domäne mit dem Befehl CREATE DOMAIN boolean definieren.Die booleschen Operationen sind damit aber in keiner Weise verfügbar.

4.3.3 Operationen mit DatentypenMit den Datentypen sind bestimmte erlaubte und sinnvolle Operationen undFunktionen verbunden. Wir stellen dies hier nur beispielhaft dar und verzichtenauf eine vollständige Aufzählung.

Operationen mit Zahlen

Für numerische Datentypen sind dies zunächst einmal die arithmetischen Opera-toren:

Weitere mathematische Operationen wie Potenzierung können mit speziellenFunktionen ermöglicht werden oder sind selbst zu definieren (vgl. Kapitel 7.2).

Bei arithmetischen Operationen gelten die üblichen Hierarchieregeln� Punktrechnung geht vor Strichrechnung.� Bei gleicher Hierarchiestufe wird von links nach rechts gerechnet.� Um davon abzuweichen, sind Klammern zu setzen.

Operationen mit Zeichenketten

Eine ganze Ansammlung von Operatoren und Funktionen für Zeichenketten stehtebenfalls zur Verfügung. Dazu gehören Funktionen zur Ermittlung der Längeeiner Zeichenkette, zur Extraktion bestimmter Teile, zum Entfernen von Leerzei-chen am Anfang und Ende, zur Konvertierung in Großbuchstaben etc. Wir kom-men auf diese Funktionen in Kapitel 5 zurück.

Der Operator für die Zeichenverkettung ist:13

||

+ Addition

- Subtraktion

* Multiplikation

/ Division

13 Zwei senkrechte Striche, im ASCII-Code durch den Wert 124 wiedergegeben.

Page 12: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

4 Datendefinition in SQL

162

Durch Verkettung von Zeichenketten können zwei oder mehr Spalten virtuell wieeine ausgegeben werden. Beispielsweise können wir Vornamen und Nachnamen(unterstellt, diese wären in verschiedenen Spalten enthalten) für ein Adressetikettso zusammenfügen:

vorname ||' '|| nachname

Operationen mit Datums- und Zeitdaten

Eine Anzahl von Operationen, die sich mit Datums- und Zeitwerten befassen, istim Standard definiert. Dazu gehören Differenzen zwischen Datums- und Zeitwer-ten mit dem Ergebnis eines Intervalls (Tage, Stunden etc.). Auf der anderen Seitekönnen durch Addition oder Subtraktion von Intervallwerten zu Werten vom TypTIMESTAMP neue Werte vom Typ TIMESTAMP gewonnen werden.

Operationen mit booleschen Werten

Für Wahrheitswerte gibt es die üblichen Operatoren AND, OR und NOT. Zum Ver-gleich von Wahrheitswerten benutzt man nicht das Gleichheitszeichen, sondernden Operator IS. Das Ergebnis des Vergleichs ist wieder ein boolescher Wert, deraber nur die Werte TRUE oder FALSE annehmen kann. Wenn wir bei der Artikel-tabelle das Attribut kann_wegfallen mit dem Datentyp BOOLEAN definieren,könnte eine Abfrage beispielsweise die Bedingung enthalten:

WHERE kann_wegfallen IS TRUE

oder auch nur:

WHERE kann_wegfallen

In beiden Fällen steht hinter WHERE ein Wahrheitswert. Im ersten Fall kann nurTRUE oder FALSE herauskommen, der zweite Ausdruck kann die Werte TRUE,FALSE oder UNKNOWN annehmen, falls für die Spalte kann_wegfallen Nullmar-ken erlaubt sind.

Operationen zur Typkonvertierung

Die CAST-Funktion konvertiert skalare Datentypen, sofern der infrage stehendeWert überhaupt in einen anderen Datentyp konvertiert werden kann. Die allge-meine Syntax ist:

CAST (Skalarer Ausdruck AS [datentyp | domäne])

Beispielsweise kann mit

CAST ('333' AS INTEGER)

die Zeichenfolge ‘333’ in die Zahl 333 umgewandelt werden. Die Zeichenfolgemuss natürlich der Konvention für die Darstellung von Zahlen genügen (vgl.Abschnitt 4.3.4).

Page 13: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

DDL: Datendefinition mit SQL

163

Diese Operation kann auch für Datums- und Uhrzeitwerte angewandt werden;z.B. ergibt

CAST ('1997-04-01' AS DATE)

das Datum DATE'1997-04-01' (also den 1. April 1997).

Vergleiche von Daten

Die folgende Tabelle listet die Operatoren für Vergleiche auf.

Diese Vergleichsoperatoren können immer angewandt werden, wenn auf beidenSeiten kompatible Daten stehen. Kompatibel sind zum einen alle Daten desselbenDatentyps, aber darüber hinaus alle numerischen Datentypen und alle Zeichenket-ten-Datentypen. Somit können natürlich SMALLINT-Größen mit REAL-Größenverglichen werden oder Zeichenketten der Länge 10 mit Zeichenketten der Länge5. Der Vergleich verschiedener Datums- und Zeitintervalle ist nicht immer mög-lich. Ist ein Intervall von 30 Tagen identisch mit einem Monatsintervall? Intervallevom Typ YEAR TO MONTH sind beispielsweise nicht mit Intervallen vom TypDAY TO SECOND vergleichbar.

Beim Vergleich von Zeichenketten wird diejenige Zeichenkette als »kleiner«behandelt, deren Anfangszeichen aufgrund der Zeichensatzordnung weiter vornim Alphabet stehen, wobei ggf. nationale Besonderheiten (z.B. dass »ß« in der Sor-tierung äquivalent zu »ss« ist) berücksichtigt werden müssen. 14

4.3.4 Repräsentation der Datentypen

Im Folgenden werden jeweils Beispiele der festgelegten Repräsentation der Datenfür die entsprechenden Datentypen angegeben:

= gleich

<> ungleich. In einigen DBMS wird stattdessen der Operator != verwendet.

> größer als

>= größer/gleich

< kleiner

<= kleiner/gleich

14 Vgl. [DaDa93 Kapitel 19].

Page 14: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

4 Datendefinition in SQL

164

Die Schreibweise ist noch nicht in allen Systemen systematisch eingeführt. So ent-fallen insbesondere in einigen Systemen die datenspezifischen Präfixe wie DATE,TIME, so dass zum Beispiel der 21. Juni 2004 als '2004-06-21' zu schreiben ist. EineUnterscheidung zu dem entsprechenden String erfolgt jeweils aus dem Zusam-menhang.

INTEGER 123456–635480+1

SMALLINT 1234–6354+1

NUMERIC(p,q)DECIMAL(p,q)

1234.56-1234.67

REALDOUBLE PRECISIONFLOAT(p)

1234.56-1234.67 2.96E+8 3.14E00-9.8E-3

CHARACTER(n) CHARACTER VARYING(n)

'Bremerhaven''Lübeck'

BIT(n)BIT VARYING(n)

B'0110'X'03F4'

DATE DATE'1995-06-22'

TIME(p) TIME'09:18:05.23'TIME'09:15'

TIMESTAMP(p) TIMESTAMP'1995-06-06 10:00'

TIME(p) WITH TIME ZONE TIME'09:00+1:00'

TIMESTAMP(p) WITH TIME ZONE TIMESTAMP'1995-06-06 10:00+1:00'

INTERVAL INTERVAL '3' DAYINTERVAL '10:30' HOUR TO MINUTEINTERVAL '10:30' MINUTE TO SECONDINTERVAL '1-6' YEAR TO MONTHINTERVAL '3 12:00' DAY TO MINUTE

Page 15: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

DDL: Datendefinition mit SQL

165

4.3.5 CREATE TABLE

Die Anweisung CREATE TABLE dient zur Anlage von Tabellen in einer Datenbank.Die Struktur der neuen Tabelle wird in Form von Spalten mit jeweils spezifischerDomäne oder ersatzweise mit Datentyp und Länge festgelegt. Es wird eine leereBasistabelle erzeugt und gewisse Daten werden in Systemtabellen eingetragen.

Folgende Konsistenzbedingungen können für eine Tabelle festgelegt werden:� Primärschlüssel der Tabelle� Weitere Schlüssel (Kandidatenschlüssel) der Tabelle� Fremdschlüssel mit Bezugstabelle und Verfahrensregeln für die Gewährleis-

tung der referenziellen Integrität� Einschränkungen des Wertebereichs der Spalten� Verbot von Nullmarken in Spalten� Spaltenübergreifende Integritätsbedingungen� Tabellenübergreifende Integritätsbedingungen

Eine CREATE TABLE-Anweisung kann im konkreten Fall beliebig kompliziertaussehen. Sie setzt sich wie folgt zusammen:

CREATE TABLE tabellenname (spaltendefinitionsliste [,tabellenintegritätsregelliste])

Jede Tabelle muss mindestens eine Spalte haben.

spaltendefinition ::= spaltenname typangabe [vorgabewert] [spaltenintegritätsregelliste]

Hierbei ist die Typangabe jeweils ein Datentyp oder eine vorher in der Datenbankdefinierte Domäne, wie in Abschnitt 4.3.1 eingeführt.

Vorgabewert, Tabellen- und Spaltenintegritätsregeln werden im Verlauf diesesKapitels erklärt. Eine bekannte Spaltenintegritätsregel ist die Festlegung NOT NULL.

Der Name der Tabelle muss innerhalb des Schemas eindeutig sein. Innerhalb einerTabellendefinition sind die Spaltennamen ebenfalls eindeutig.

Das folgende Beispiel enthält nur eine Spaltendefinitionsliste und keine Tabellen-integritätsregeln. Als einzige Spaltenintegritätsregel wird NOT NULL festgesetzt:

CREATE TABLE kunde ( kunden_nr INTEGER NOT NULL, name CHAR(30) NOT NULL, strasse CHAR(30), plz CHAR(5), ort CHAR(30) NOT NULL)

Page 16: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

4 Datendefinition in SQL

166

Die Integritätsregeln, die nach dem Standard für Spalten und/oder Tabellen in dieDatendefinition eingebracht werden können, werden durch Zusatzklauseln in derCREATE TABLE-Anweisung formuliert. Diese können in unterschiedlicher Formin Tabellen- und Spaltenintegritätsregeln verwendet werden. Es sind folgendeKlauseln verfügbar, die in den anschließenden Abschnitten erläutert werden:

tabellenintegritätsregel ::= check-klausel | primary_key-klausel | unique-klausel | foreign_key-Klausel

Jeder Integritätsregel kann ein Name gegeben werden, was sich bei Verstößen imZuge von Dateneingaben oder Änderungen positiv auswirkt, da das DBMS dannhäufig den Namen der verletzten Regel mit ausgibt. Die Syntax dazu:

CONSTRAINT regelname regel

Wir machen in den folgenden Beispielen teilweise davon Gebrauch, verzichtenaber manchmal aus Platzgründen auf die Benennung.

Vorgabewert Der Vorgabewert in der Spaltendefinition enthält alternativ eine DEFAULT-Klau-sel, eine IDENTITY-Spezifikation oder eine GENERATION-Klausel. In allen Fällengeht es darum, Spaltenwerte als Konstante oder als Ergebnis irgendeiner Berech-nungsfunktion vorzugeben.

DEFAULTDie DEFAULT-Klausel in der Spaltendefinition ermöglicht die ausdrücklicheAngabe von Vorgabewerten für den Fall, dass bei der Erfassung oder Änderungkein Spaltenwert explizit angegeben wird. Ohne diese Klausel ist der VorgabewertNULL.

default-klausel ::= DEFAULT NULL | DEFAULT systemvariable | DEFAULT literal

� NULL: Standardmäßig wird eine Nullmarke eingesetzt.� Als Systemvariablen können unter anderem die Folgenden eingesetzt werden:

CURRENT_USER, CURRENT_ROLE CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP

� literal ist eine explizite Angabe des DEFAULT-Werts. Sie muss der Datentyp-definition bzw. der Domäne der Spalte entsprechen.

Als Beispiel für eine Anwendung der DEFAULT-Klausel vergeben wir als Vorgabe-wert für die Zahlungsart eines Kunden den Wert 'N' (für »Nachnahme«). Die Spal-tendefinition sieht dann so aus:

zahlung CHAR(1) NOT NULL CONSTRAINT def_zahlung DEFAULT 'N'

Page 17: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

DDL: Datendefinition mit SQL

167

IDENTITY-SpezifikationNeu in SQL:200n ist die Möglichkeit, einer Spalte einen Generator für Sequenz-nummern zuzuordnen. Dieser bewirkt bei der Neueingabe eines Tupels, dass fürdiese Spalte automatisch fortlaufende Werte generiert werden. Ideal ist dies für dieErzeugung von Schlüsselnummern in Fällen, wo der Schlüssel ein einfaches nume-risches Attribut ohne eigene Aussage ist. Einem Attribut kann nur dann eineIDENTITY-Spezifikation angehängt werden, wenn es auf einem einfachen numeri-schen Datentyp ohne Nachkommastellen beruht.

Die Klausel lautet in vereinfachter Form:

GENERATED [ ALWAYS | BY DEFAULT ] AS IDENTITY(START WITH startwert INCREMENT BY inkrement)

Mit den Parametern wird festgelegt, dass die Folge mit dem Wert startwertbeginnt und bei jedem Einfügen eines Tupels in die Tabelle um den Wert von inkre-ment erhöht wird, wobei inkrement auch negativ sein darf. Weitere Optionen erlau-ben die Festlegung eines minimalen und maximalen Werts, und ob die Zählungwieder von vorn beginnen soll, wenn der Maximalwert erreicht worden ist. Letz-tere Einstellungen sind natürlich für Schlüsselspalten nicht interessant, denn danndürfen ja keine Wiederholungen vorkommen.

Bei Sybase Adaptive Server Anywhere wird die Klausel in ähnlicher Form angebo-ten. Wir könnten beispielsweise für eine Kundennummer automatische Wertegenerieren lassen mit:

CREATE TABLE kunde3( kunden_nr INTEGER IDENTITY NOT NULL , kname PersonenName NOT NULL, CONSTRAINT pk_kunde PRIMARY KEY (kunden_nr) );

Hier ist aber keine Festlegung von Startwert und Inkrement möglich, das DBMSfängt bei 1 an und erhöht jedesmal um 1. Beim Einfügen in die Tabelle kann mandann den Wert für die Kundennummer weglassen, beispielsweise so:

INSERT INTO Kunde3 (kname) VALUES ('Otto');

Eine Alternative zum Erzeugen von Sequenznummern besteht darin, mit demBefehl CREATE SEQUENCE einen Generator als eigenes Datenbankobjekt zu erzeugen.Beispiel:

CREATE SEQUENCE sq_kunde (START WITH 100 INCREMENT BY 1)

Beim Einfügen eines neuen Tupels in die Tabelle wird dann mit

NEXT VALUE FOR sq_kunde

in der Werteliste der nächste Wert aus der Folge abgerufen.15

15 Testen konnten wir dies leider nicht. Eine ähnliche Lösung gibt es bei ORACLE. Dort lautet derEinfügebefehl unter Zugriff auf den Nummerngenerator:INSERT INTO kunde3(kunden_nr, name) VALUES (sq_kunde.nextval, 'Otto').

Page 18: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

4 Datendefinition in SQL

168

GENERATION-Klausel

SQL sieht vor, dass eine Tabellen berechnete Spalten enthalten darf. Zur Defini-tion dient die GENERATION-Klausel. Wir gehen hier nicht darauf ein und ver-weisen zum Thema berechnete Spalten auf das Kapitel 6 über Datensichten. ImUnterschied zu den Datensichten werden aber die Werte berechneter Spalten inBasistabellen abgespeichert und bei jeder Änderung des Tupels automatischaktualisiert.

CHECK-Klausel

Die Anwendung von Domänen anstelle von Typangaben in der Spaltendefinitionwurde im Abschnitt über Domänen bereits erläutert. Die CHECK-Klausel ermög-licht Festlegungen bezüglich erlaubter Spaltenwerte unabhängig von einer Domä-nendefinition, geht aber darüber insofern hinaus, als auch Bedingungen formulier-bar sind, die mehrere Spalten betreffen.

Für die CHECK-Klausel gilt die Syntax:

CHECK (bedingung)

Die Bedingung wird wie in der WHERE-Klausel der SELECT-Anweisung angegeben.Sie muss sich auf die Spalten der zu erzeugenden Tabelle beziehen. Dabei sindaber auch Unterabfragen zulässig, die sich auf andere Tabellen beziehen. Im fol-genden Beispiel wird die CHECK-Klausel bei der Definition einer Kundentabellemehrfach angewandt, um die erlaubten Werte für die Spalten status und zahlungzu spezifizieren.

CREATE TABLE kunde ( kunden_nr INTEGER NOT NULL, status CHAR(1) NOT NULL, name CHAR(30) NOT NULL, strasse CHAR(30) NOT NULL, plz CHAR(5) NOT NULL, ort CHAR(30) NOT NULL, letzte_bestellung DATE, letzte_werbeaktion DATE, zahlungsart CHAR(1) NOT NULL, CONSTRAINT chk_status CHECK (status IN ('S','W','G')), CONSTRAINT chk_zahlungsart CHECK (zahlungsart IN ('R','B','N','V','K')) );

Bei jeder Datenänderung wird sichergestellt, dass die Bedingung nicht den logi-schen Wert FALSE annehmen kann – der Wert UNKNOWN der dreiwertigen Logik imZusammenhang mit Nullmarken ist dagegen zulässig. In dem folgenden Beispielist es also zulässig, dass liefermenge vorübergehend eine Nullmarke enthält – es ist

Page 19: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

DDL: Datendefinition mit SQL

169

nicht zulässig, dass die Attribute liefermenge und bestellmenge definierte Wertehaben und der Wert für liefermenge größer ist als der für bestellmenge.

CHECK (liefermenge <= bestellmenge)

Wie wir an folgendem Beispiel sehen, kann die CHECK-Klausel auch direkt an dieSpaltendefinition angefügt werden.

CREATE TABLE kunde ( kunden_nr INTEGER NOT NULL, status CHAR(1) NOT NULL CHECK status IN ('S', 'W', 'G'), ... zahlungsart CHAR(1) NOT NULL CHECK (zahlungsart IN ('R', 'B', 'N', 'V', 'K')) );

Die NOT NULL-Bedingung könnte auch als CHECK-Klausel formuliert werden,wir haben im Beispiel aber die übliche Kurzform beibehalten.

Wir sehen an diesem Beispiel, dass der Unterschied zwischen einer Tabelleninte-gritätsregel und einer Spaltenintegritätsregel hier verschwimmt. Es gibt in diesemFall keine Unterschiede – weder in der Formulierung noch in der Bedeutung. Diesgilt, solange eine CHECK-Klausel sich auf eine einzige Spalte bezieht. Wennmehrere Spalten betroffen sind, hat die CHECK-Klausel den Charakter einer Tabel-lenintegritätsregel und steht separat nach den Spaltendefinitionen.

Primärschlüssel

Der SQL-Standard unterstützt die Primärschlüsseldefinition auf der Ebene derTabellenerzeugung.

Jede Relation muss einen Primärschlüssel enthalten. Die PRIMARY KEY-Klauselist aber nicht verbindlicher Bestandteil der CREATE TABLE-Anweisung. Die Syn-tax folgt dem Schema:

PRIMARY KEY (spaltenliste)

Es sind die Attribute anzugeben, die zusammen den Schlüssel bilden. In vielenFällen besteht der Schlüssel nur aus einem Attribut.

Zusammen mit den bereits definierten Klauseln könnte die Definition der Kun-dentabelle so aussehen:16

CREATE TABLE kunde ( kunden_nr INTEGER NOT NULL, status CHAR(1) NOT NULL,

16 Wir haben hier der Deutlichkeit halber den Befehl ohne Rückgriff auf Domänen formuliert.Sonst würden in diesem Befehl keine CHECK-Klauseln auftreten, da diese in den Domänen-definitionen enthalten sind.

Page 20: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

4 Datendefinition in SQL

170

name CHAR(30) NOT NULL, strasse CHAR(30) NOT NULL, plz CHAR(5) NOT NULL, ort CHAR(30) NOT NULL, letzte_bestellung DATE, letzte_Werbeaktion DATE, zahlungsart CHAR(1) NOT NULL DEFAULT 'N', CONSTRAINT chk_status CHECK (status in ('S','W','G')), CONSTRAINT chk_zahlungsart CHECK (zahlungsart in ('R','B','N','V','K')) CONSTRAINT pk_kunde PRIMARY KEY (kunden_nr) );

Wenn es sich um einen einspaltigen Primärschlüssel handelt, ist es auch möglich,das Schlüsselwort PRIMARY KEY als Bestandteil der Spaltendefinition einzutragen.In unserem Beispiel könnten wir die Formulierung wie folgt abändern:

CREATE TABLE kunde ( kunden_nr INTEGER NOT NULL PRIMARY KEY, ... );

Hinter den Schlüsselwörtern PRIMARY KEY entfällt dann die Angabe der Spalte.Damit wäre die Klausel als Spaltenintegritätsregel formuliert. Dies ändert abernichts an der Tatsache, dass ein Primärschlüssel sich immer auf eine ganze Tabellebezieht und nicht nur auf die (ggf. einzige) Spalte, aus der er besteht. Wir empfeh-len daher, die PRIMARY KEY-Klausel immer nach den Spaltendefinitionen hinzu-schreiben.

Die Einbeziehung eines Attributs in den Primärschlüssel setzt voraus, dass für die-ses Attribut Nullmarken ausgeschlossen sind. Nach dem Standard kann auf dieseAngabe verzichtet werden – das System setzt diese Bedingung automatisch ein.

UNIQUE-Klausel

Diese Erweiterung der Tabellendefinition dient dazu, Kandidatenschlüssel zu ver-walten, also Attribute oder Attributkombinationen, die geeignet sind, ein Tupeleindeutig zu identifizieren. Der Primärschlüssel stellt davon nur einen Spezialfalldar. Die Syntax lautet:

unique_klausel ::= UNIQUE (spaltenliste | VALUE )

Bei einer UNIQUE-Angabe wird nicht verlangt, dass die Definitionen derzugrunde liegenden Spalten die Klausel NOT NULL enthalten. Es wird dann nicht alsVerstoß gegen die Eindeutigkeit gewertet, wenn der Schlüsselkandidat für eineZeile eine Nullmarke hat. Bei mehrspaltigen Schlüsseln wäre sogar jede »eindeu-tige« Kombination von Nullmarken einmal erlaubt. Wir halten dies für keine gute

Page 21: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

DDL: Datendefinition mit SQL

171

Lösung, da hier implizit so getan wird, als sei NULL von jedem anderen Wert zuunterscheiden. Wenn die Nullmarke bedeutet, »Wert vorhanden, aber nicht bekannt«(A-Marke), ist diese Unterstellung nicht zu halten.

Auf der anderen Seite ist damit auch festgelegt, dass für eine UNIQUE-Bedingung,die I-Marken enthalten kann, jeweils nur ein Tupel NULL enthalten kann. So kannz.B. ein Fahrzeugmotor immer nur in einem Fahrzeug eingebaut sein – oder in kei-nem, wenn er zur Überholung in der Werkstatt ist –, ein Fall, der durch eineI-Marke zu kennzeichnen wäre. Eine UNIQUE-Bedingung auf der Fahrzeugnum-mer führt aber dazu, dass maximal ein Motor jeweils zur Überholung in der Werk-statt sein darf. Dieser Sachverhalt ist also dann anders abzubilden (z.B. indem fürdie Beziehungsmenge ist_eingebaut_in eine eigene Relation mit den AttributenFahrzeugnummer und Motornummer und ggf. weiteren Attributen gebildetwird).

Zum Beispiel könnte für die Buchhaltung jedem Kunden eindeutig ein Debitoren-konto zugeordnet sein:

CREATE TABLE KUNDE ( kunden_nr INTEGER NOT NULL, ,,, konto_nr INTEGER NOT NULL, CONSTRAINT pk_kunde PRIMARY KEY (kunden_nr), CONSTRAINT uq_kunde UNIQUE (konto_nr) );

UNIQUE kann bei einspaltigen Kandidatenschlüsseln auch in Kurzform als Bestand-teil der Spaltendefinition verwendet werden. Mit UNIQUE (VALUE) wird festge-legt, dass die Tupel einer Tabelle eindeutig sein müssen, also je zwei Tupel sich inmindestens einem Attributwert unterscheiden.17

FOREIGN KEY-Klausel

Die Anforderungen der referenziellen Integrität werden sehr gut unterstützt. Essoll sichergestellt werden, dass für einen Fremdschlüssel nur solche Werte verwen-det werden dürfen, die auch in der Menge der korrespondierenden Primärschlüs-selwerte vorkommen.

Beispielsweise soll in einer Tabelle bestellung die Kundennummer kunden_nr alsFremdschlüssel für die Tabelle kunde vorkommen. Damit kann zu jedem Auftragder zugehörige Auftraggeber ermittelt werden. Es muss sichergestellt werden,dass nur gültige, d.h. in kunde vorhandene Kundennummern in bestellung erfasstwerden können. Dies ermöglicht die FOREIGN KEY-Klausel. Die Syntax der Klau-sel lautet:

17 Bei Relationen wäre dies ohnehin gegeben, bei Tabellen sind aber mehrere gleiche Tupel mög-lich (vgl. Kapitel 2.6).

Page 22: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

4 Datendefinition in SQL

172

foreign_key-klausel ::= FOREIGN KEY (spaltenliste) REFERENCES tabellenname [(spaltenliste)] [MATCH übereinstimmungstyp] [ON DELETE änderungsaktion] [ON UPDATE änderungsaktion]

Die nicht obligatorischen Teilklauseln MATCH sowie ON DELETE und ON UPDATE wer-den weiter unten gesondert behandelt.

Die Spaltenangabe nach der Angabe der referenzierten Tabelle ist dann erforder-lich, wenn sich der Fremdschlüssel nicht auf den Primärschlüssel, sondern aufeinen Kandidatenschlüssel bezieht. Ansonsten kann sie entfallen.

In der Tabelle bestellung enthält das Attribut kunden_nr die Kundennummer, dieauf das gleichnamige Attribut in der Kundentabelle verweist.

CREATE TABLE bestellung ( bestell_nr INTEGER NOT NULL, kunden_nr INTEGER NOT NULL, bestelldatum DATE NOT NULL DEFAULT CURRENT DATE, lieferdatum DATE, rechnungsbetrag MONEY, CONSTRAINT pk_bestellung PRIMARY KEY (bestell_nr), CONSTRAINT fk_bestellung_kunde FOREIGN KEY (kunden_Nr) REFERENCES kunde );

Auch hier ist eine Kurzform möglich, wenn der Fremdschlüssel nur aus einerSpalte besteht. Die Kurzform lautet hier:

CREATE TABLE bestellung ( bestell_nr INTEGER NOT NULL PRIMARY KEY, kunden_nr INTEGER NOT NULL FOREIGN KEY REFERENCES kunde, ,,, );

MATCH-Klausel

Mit der Match-Klausel kann festgelegt werden, welcher Grad der Übereinstim-mung von Fremdschlüsselwerten mit dem Primär- oder Kandidatenschlüssel derreferenzierten Tabelle verlangt wird. Diese Festlegung ist nur dann von Relevanz,wenn der Fremdschlüssel aus mehreren Attributen besteht, von denen wenigstensein Teil Nullmarken enthalten kann. Grundsätzlich gilt die referenzielle Integritätimmer dann als erfüllt, wenn der gesamte Fremdschlüssel NULL ist. Wenn aberein Teil der Attribute eine Nullmarke enthält, sind mehrere Varianten möglich:

übereinstimmungstyp ::= SIMPLE | PARTIAL | FULL

Page 23: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

DDL: Datendefinition mit SQL

173

SIMPLE

Mit der Klausel MATCH SIMPLE wird festgelegt, dass die referenzielle Integritätbereits als erfüllt gilt, wenn eines der Fremdschlüsselattribute NULL ist. Dasbedeutet, die Übereinstimmung des Fremdschlüssels mit einem Schlüssel in derVatertabelle wird überhaupt nur dann überprüft, wenn alle Fremdschlüsselattri-bute einen Wert haben. Diese Regel gilt auch implizit, wenn keine MATCH-Klauselangegeben wird, und war in bisherigen Versionen des Standards die einzige Mög-lichkeit.

PARTIAL

Hier wird zugelassen, dass Teile eines Fremdschlüssel NULL-Werte haben dürfen.Die Übereinstimmung von Fremdschlüssel- und Primär- oder Kandiatenschlüsselwird im Unterschied zur SIMPLE-Variante überprüft, aber nur für die Attribute,die einen Wert haben.

FULL

Hier wird generell verlangt, dass entweder alle Fremdschlüsselattribute NULLsind oder alle einen Wert haben müssen, der dann auf Übereinstimmung mitSchlüsselwerten in der referenzierten Tabelle überprüft wird. Enthält ein Teil derFremdschlüsselattribute eine Nullmarke, gilt die referenzielle Integrität als ver-letzt.

Wenn bei der Tabellendefinition für alle Fremdschlüsselattribute NOT NULL verlangtwird – kein Fremdschlüsselattribut darf dann fehlen – ist die Unterscheidung derÜbereinstimmungstypen ohne Relevanz, die MATCH-Klausel ist dann überflüssig.

Aktionsregeln für die referenzielle Integrität

Mit der FOREIGN KEY-Klausel wird erreicht, dass nur gültige Fremdschlüssel-werte erfasst werden können. Damit ist bei »Vater-Sohn-Beziehungen« zwischenTabellen die Integrität der abhängigen Tabelle gesichert. Die referenzielle Integritätkann aber auch durch Änderungen in der Vatertabelle bedroht sein. Dies ist dannder Fall, wenn dort eine Zeile gelöscht wird, deren Primärschlüsselwert von derabhängigen Tabelle referenziert wird, oder wenn ein als Fremdschlüsselwert vor-kommender Primärschlüsselwert verändert wird.

Der SQL-Standard definiert eine Syntax für Regeln, die bei schreibenden Zugriffenauf referenzierte Primärschlüsselwerte die Integrität gewährleisten. Darin könnenAktionen festgelegt werden: Die Veränderung kann ganz verboten werden, siekann an den Fremdschlüsselwert weitergegeben werden oder dieser kann auf NULLbzw. den Default-Wert gesetzt werden.

Syntaktisch ist Folgendes definiert:

änderungsaktion ::= NO ACTION | CASCADE | SET NULL | SET DEFAULT

Page 24: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

4 Datendefinition in SQL

174

NO ACTION

Jegliche Änderung an den referenzierten Schlüsselwerten ist untersagt, wenn eskorrespondierende Fremdschlüsselwerte gibt. Diese Regel gilt auch implizitimmer dann, wenn keine Änderungsaktion angegeben wird.18

Wir können also beispielsweise keinen Kunden löschen, zu dem noch Bestellungenexistieren. Aktualisierungen oder Löschungen solcher Primärschlüsselwerte sinduntersagt.

CASCADE

Die per Fremdschlüsselwert korrespondierenden Zeilen in der abhängigen Tabellewerden entsprechend manipuliert, wenn der referenzierte Schlüsselwert gelöschtoder geändert wird. Wird also ein Kunde gelöscht, dann verliert man auch seineBestellungen.

SET NULL

Korrespondierende Fremdschlüsselwerte werden auf NULL gesetzt, wenn der refe-renzierte Schlüssel manipuliert wird. Das setzt voraus, dass für die Fremdschlüs-selwerte Nullmarken zugelassen sind, was im Beispiel der Kunden und Bestellun-gen natürlich auszuschließen ist. Es gibt aber solche Fälle: Wird beispielsweise ineiner Tabelle abteilung der Abteilungsleiter durch einen Fremdschlüssel auf dieTabelle personal dargestellt, so kann dieser vorübergehend eine Nullmarke enthal-ten. Das bedeutet dann, dass die Abteilung zurzeit keinen Leiter hat.

SET DEFAULT

Alle entsprechenden Fremdschlüsselwerte werden auf den bei der Tabellendefini-tion mit der DEFAULT-Klausel definierten Standardvorgabewert gesetzt, wennder Primärschlüsselwert verändert wird.

Auswahl der passenden Variante

Welche dieser Möglichkeiten infrage kommt, muss nach der jeweiligen Sachlageentschieden werden. Würde die Option ON DELETE CASCADE bei der Definition derBestellungstabelle angewandt, hätte dies zur Folge, dass mit jedem Kunden, dergelöscht wird, zugleich seine Aufträge verschwinden. Bei ON DELETE SET NULL wür-den die Aufträge erhalten bleiben, wären aber keinem Kunden mehr zugeordnet.In diesem Beispiel der Beziehung kunde-bestellung wird man in den meisten Fir-men wohl die Variante NO ACTION bevorzugen. Falls in einen Auftrag schon sehrviel investiert wurde – beispielsweise im Schiffbau –, könnte aber auch bei Ausfalldes Auftraggebers ein Nullsetzen der Kundennummer angezeigt sein, was bedeu-tet, dass für einen bestehenden Auftrag ein neuer Kunde zu suchen ist. Bei bestel-lung und position wird in vielen Fällen ein kaskadierendes Verfahren sinnvoll

18 Bei manchen DBMS (z.B. ORACLE, Sybase) wird dies durch RESTRICTED ausgedrückt.

Page 25: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

DDL: Datendefinition mit SQL

175

sein: Wird ein Auftrag storniert, entfallen auch alle Positionen. Bei der Definitionder Tabelle position wäre dann Folgendes anzugeben (wir unterstellen diesmal,dass für die einzelnen Wertebereiche der Attribute Domänen definiert wurden):

CREATE TABLE position ( bestell_nr Bestell_key NOT NULL, artikel_nr Artikel_key NOT NULL, mwst Prozentsatz, -- aus Artikeldatei zu übernehmen bestellmenge CARDINAL NOT NULL, liefermenge CARDINAL, gesamtpreis MONEY, CHECK (bestellmenge >= 1), CHECK (liefermenge <= bestellmenge)), PRIMARY KEY (bestell_nr, artikel_nr), CONSTRAINT fk_position_bestellung FOREIGN KEY (bestell_nr) REFERENCES bestellung ON UPDATE CASCADE ON DELETE CASCADE, CONSTRAINT fk_position_artikel FOREIGN KEY (artikel_nr) REFERENCES artikel );

Die Kurzform, bei der die Fremdschlüsseleigenschaft einer Spalte direkt bei derSpaltendefinition angegeben wird, lautet hier:

CREATE TABLE position ( bestell_nr Bestell_key NOT NULL FOREIGN KEY REFERENCES bestellung ON UPDATE CASCADE ON DELETE CASCADE, ,,, );

4.3.6 AssertionsIntegritätsbedingungen, die mehrere Tabellen betreffen, können nicht immer alsBestandteil der CREATE TABLE-Anweisung formuliert werden. Solche Einschrän-kungen werden im Standard als Assertion (»Zusicherung«) bezeichnet. Es gibtdort auch eine entsprechende Anweisung CREATE ASSERTION mit folgender Syntax:

CREATE ASSERTION assertion_name CHECK (bedingung) [attributliste]

Page 26: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

4 Datendefinition in SQL

176

Es ist jeweils eine logische Bedingung anzugeben, die nicht verletzt werden darf.Die optionalen Attribute können beschreiben, dass die Assertion verzögert werdenkann (um z.B. eine Bedingung zu formulieren, die Aktionen in mehr als einerTabelle erfordert).

Das folgende Beispiel stellt sicher, dass einem Kunden die Zahlungsart 'B' für»Bankeinzug« nur dann zugewiesen werden kann, wenn in der Datenbank seinBankkonto erfasst ist.19

CREATE ASSERTION kunde_zahlart CHECK (NOT EXISTS ( SELECT * FROM kunde k WHERE zahlung = 'B' AND NOT EXISTS ( SELECT * FROM girokonto g WHERE g.kunden_nr = k.kunden_nr ))) DEFERRABLE;

Wenn die Anweisung CREATE ASSERTION nicht zur Verfügung steht, wie es bei vie-len DBMS noch der Fall ist, muss man unter Umständen zum Hilfsmittel derDatenbank-Trigger greifen, um eine tabellenübergreifende Integritätsbedingungzu formulieren.20 Das ist dann zwar eine prozedurale statt einer deklarativenLösung, aber immer noch besser, als das Problem in die Anwendungsprogrammie-rung zu verlegen.

4.3.7 Entfernung von DatenbankobjektenSämtliche Datenbankobjekte, die mit irgendeiner Form einer CREATE-Anweisungangelegt wurden (CREATE TABLE, CREATE DOMAIN etc.), können aus der Datenbankauch wieder entfernt werden. Dazu stehen Varianten der DROP-Anweisung zurVerfügung. Dabei ist grundsätzlich zu beachten, dass Datenbankobjekte selbstauch einer Art referenzieller Integrität unterworfen sind. Tabellen oder Domänenkönnen ja von anderen Objekten aus referenziert werden.

Die Entfernung einer Datenbanktabelle geschieht beispielsweise mit der DDL-Anweisung DROP TABLE. Sofern eine Tabelle an keiner definierten Beziehung teil-nimmt und keine Datensichtdefinitionen auf sie Bezug nehmen, wird die Anwei-sung ohne weiteres ausgeführt. Anders sieht es aus, wenn beispielsweise eineFremdschlüsselbeziehung zu der fraglichen Tabelle existiert.

19 Der hier vorgestellte Befehl CREATE ASSERTION konnte bisher nicht getestet werden, da keinden Autoren zugängliches DBMS ihn unterstützt.

20 Vgl. Kapitel 7.

Page 27: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

DDL: Datendefinition mit SQL

177

Wenn beispielsweise eine Tabelle bestellung mit der Integritätsregel

... FOREIGN KEY (kunden_nr) REFERENCES kunde

definiert ist, wird die Anweisung DROP TABLE kunde dann nicht ausgeführt, daimplizit eine Restriktion gilt. Sollen hingegen mit einer Tabelle alle Bezüge auf sieebenfalls gelöscht werden, muss dies mit dem Zusatz CASCADE angefordert werden.Die Anweisung

DROP TABLE kunde CASCADE;

löscht automatisch die obige Integritätsdefinition aus der Tabelle bestellung.

4.3.8 CREATE INDEXDie Definition von Indexen gehört nicht in die Datendefinitionssprache im enge-ren Sinne. Indexe dienen dazu, Abfragen an eine Datenbank zu beschleunigen.21

Sie sind aber bei einem echten relationalen Datenbanksystem nicht erforderlich,um Daten überhaupt zu finden. Die Formulierung von Abfragen ist unabhängigvon der Existenz oder Nichtexistenz von Indexen.22 So wird der Kunde mitkunden_nr = 103 mit der Anweisung

SELECT * FROM kunde WHERE kunden_nr = 103

gesucht – unabhängig davon, ob ein Index auf kunden_nr existiert oder nicht.23

Bei klassischen Dateiverwaltungssystemen wäre hingegen die Nutzung einesIndex explizit anzufordern. Ein Beispiel im Pseudocode für den Fall, dass einIndex existiert:

Öffne Kundendatei für lesenden Zugriff über Index kunden_nrLies Kundensatz mit Schlüssel kunden_nr = 103Falls nicht gefunden: Fehlerbehandlung

Falls kein Index existiert, wäre dagegen in etwa wie folgt zu verfahren:

Öffne Kundendatei für sequenziellen lesenden Zugriff Lies ersten SatzSolange letzter Lesezugriff erfolgreich und kunden_nr ≠ 103 tue Lies nächsten SatzEnde tueFalls nicht kunden_nr ≠ 103: Fehlerbehandlung

21 Vgl. Kapitel 2.7.22 Das ändert nichts daran, dass erfahrene Anwendungsentwickler unter Umständen eine von

mehreren äquivalenten Formulierungen einer Abfrage bevorzugen, um den Optimierer »aus-zutricksen«. Sie riskieren aber, dass beim nächsten Versionswechsel des DBMS der erwünschteEffekt nicht mehr eintritt.

23 Allerdings können die Antwortzeiten in den beiden Fällen erheblich voneinander abweichen.

Page 28: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

4 Datendefinition in SQL

178

Wir führen Indexe hier auf, da sie ein wichtiges Instrument bei der Gestaltung vonDatenbankanwendungen sind und ihre Definition in vielen Fällen zugleich mit derDefinition der Tabellen erfolgt.

Die Syntax der CREATE INDEX-Anweisung ist nicht Gegenstand des SQL-Standards.Dennoch ähneln sich die verschiedenen SQL-Implementationen in diesem Punkt.Die Syntax bei ORACLE, Sybase oder DB2 lautet beispielsweise:

CREATE [UNIQUE] INDEX index_name ON tabellenname (spaltenliste) [ASC | DESC]

Der Zusatz UNIQUE bewirkt, dass für sämtliche Zeilen der Tabelle die Kombinationder Werte der Indexspalten verschieden sein muss. Damit konnten in der Vergan-genheit auch solche DBMS indirekt das Primärschlüsselkonzept unterstützen, beidenen die PRIMARY KEY- und die UNIQUE-Klausel in der CREATE TABLE-Anweisung (seit 1989 Bestandteil des SQL-Standards) noch nicht verfügbar waren.

Die Angabe von ASC bzw. DESC bewirkt die aufsteigende bzw. absteigende Sortie-rung des Index und ist nur wichtig für sortierte Ausgaben von Daten, in denen dasSortierkriterium mit den Spalten eines Index beginnt.

Zum Beispiel wird mit folgender Anweisung ein aufsteigend sortierter, eindeuti-ger Index über die Spalte kunden_nr in der Kundentabelle definiert:

CREATE UNIQUE INDEX ix_kunde ON kunde (kunden_nr);

Zu beachten ist, dass Indexe nicht nur die Datenbank schneller machen. Wenn dasDBMS einerseits Abfragen beschleunigt bearbeitet, wird es bei Einfüge- und Ände-rungsoperationen meist langsamer. Aber auch Abfragen können unter Umständendurch Indexe verlangsamt werden – ein weites Feld für Experimente!24

4.3.9 Übungsaufgaben

Aufgabe 4.1

In einer Datenbank sind die Tabellen angestellte(abtnr, ...) undabteilung(abtnr, ...) enthalten. In der Anweisung CREATE TABLE angestellte fin-det sich die Klausel:

FOREIGN KEY abteilung REFERENCES abteilung(abtnr) ON UPDATE CASCADE

In abteilungen wird nun ein Primärschlüsselwert geändert, der als Fremdschlüs-selwert referenziert wird. Die Nummer einer Abteilung, zu der Angestellte gehö-ren, wird also geändert und die vorherige Abteilungsnummer existiert danachnicht mehr.

24 Siehe hierzu den Aufsatz: »Kriterien für die Anlage eines Index« [Unte93a].

Page 29: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor

DDL: Datendefinition mit SQL

179

a) Was passiert aufgrund des oben angegebenen Anweisungsteils in angestellte? b) Was würde passieren, wenn die obige Anweisung mit der Aktionsregel ON UP-

DATE SET NULL formuliert worden wäre?c) Was würde passieren, wenn die obige Anweisung mit der Aktionsregel ON UP-

DATE NO ACTION formuliert worden wäre?

Aufgabe 4.2

Dozent Teilnehmer

Seminar

Seminarteilnehmer

Die oben dargestellte Datenstruktur ist in einer SQL-Datenbank zu realisieren. DiePrimärschlüssel sind jeweils unterstrichen. Zuvor sind aber noch ein paar kleineProbleme zu klären. a) Welche Normalformen sind verletzt (vgl. Kapitel 3.4)?b) Wie sind die entsprechenden Tabellen zu modifizieren, damit die erste bis dritte

Normalform erfüllt wird?c) Definieren Sie Domänen mit der CREATE DOMAIN-Anweisung.d) Definieren Sie die Tabellen mit der CREATE TABLE-Anweisung.

DozNr DozName TnNr TnName

10 Peters 100 Lück

11 Meier 101 Hinz

12 Otten 102 Kunz

SemNr Thema Datum Preis DozNr DozName

1001 DatStru 13.12.2003 250 10 Peters

1002 SysAnal 15.10.2003 350 12 Otten

SemNr TnNr TnName Bezahlt

1001 100 Lück J

1001 102 Kunz N

1002 101 Hinz J

Page 30: 4 Datendefinition in SQL - bilder.buecher.de · 1979 Oracle liefert ein erstes relationales Datenbanksystem mit SQL aus. 1981 IBM liefert SQL/DS aus. 1983 IBM stellt DB2 vor