vorheriges KapitelInhaltsverzeichnisIndexInfoseitenächstes Kapitel



9


Tabellen erzeugen und verwalten

Ziele

Die Anweisung CREATE DATABASE

Die Anweisung CREATE TABLE

Die Anweisung ALTER TABLE

Die Anweisung DROP TABLE

Die Anweisung DROP DATABASE

Zusammenfassung

Fragen & Antworten

Workshop



Ziele

Der heutige Tag beschäftigt sich mit dem Erstellen von Datenbanken und erläutert die Anweisungen CREATE DATABASE, CREATE TABLE, ALTER TABLE, DROP TABLE und DROP DATABASE. Diese SQL-Anweisungen gehören zur Kategorie der DDL, das heißt der Data Definition Language oder Datendefinitionssprache. (Die SQL-Anweisungen SELECT, UPDATE, INSERT und DELETE fallen dagegen in die Kategorie der DML, das heißt Data Manipulation Language oder Datenmanipulationssprache.) In der heutigen Lektion lernen Sie, wie man ...


Sie kennen bereits einen großen Teil des SQL-Vokabulars und haben die SQL-Abfrage im Detail - beginnend bei den Grundlagen - untersucht. Am zweiten Tag haben Sie gelernt, wie man Daten aus der Datenbank auswählt. Tag 8 hat gezeigt, wie man Daten in eine Datenbank einfügt, dort aktualisiert und löscht. Vielleicht stellt sich bei Ihnen nun die Frage, woher diese Datenbanken überhaupt kommen. Aus Gründen der Vereinfachung haben wir bisher das Erstellen von Datenbanken und Tabellen ausgespart und sind davon ausgegangen, daß diese Datenbankobjekte bereits auf Ihrem System existieren. Heute erzeugen Sie schließlich diese Objekte.


Die Syntax der CREATE-Anweisungen kann extrem einfach, aber auch sehr komplex sein, je nachdem, welche Optionen Ihr Datenbank-Managementsystem (DBMS) unterstützt, und wie weit Sie beim Erstellen der Datenbank ins Detail gehen möchten.


Die Beispiele der heutigen Lektion sind mit Personal Oracle8 entstanden. Falls Sie mit einem anderen System arbeiten, sollten Sie sich anhand der Dokumentation mit der jeweiligen SQL-Implementierung und kleineren Unterschieden in der Syntax vertraut machen.


Die Anweisung CREATE DATABASE

Der erste Schritt in jedem Datenbankprojekt ist das Erstellen der Datenbank. Das kann eine einfache, aber auch komplizierte Aufgabe sein, je nach den gestellten Anforderungen und dem gewählten Datenbank-Managementsystem. Viele moderne Systeme (einschließlich Personal Oracle8) bieten grafische Werkzeuge, mit denen man die Datenbank bequem auf einen Mausklick hin erstellen kann. Trotzdem sollten Sie die SQL-Anweisungen kennen, die man per Mausklick auslöst.


Aus persönlichen Erfahrungen ist uns bekannt, wie wichtig das Erstellen eines guten SQL-Installationsskripts ist. Diese Skript-Datei enthält den erforderlichen SQL-Code, um eine Datenbank oder mehrere Datenbanken vollständig neu aufzubauen. Darüber hinaus enthält das Skript oft Datenbankobjekte wie Indizes, gespeicherte Prozeduren und Trigger. Den Wert eines derartigen Skripts lernen Sie während der Entwicklung kennen, wenn Sie laufend Änderungen an der zugrundeliegenden Datenbank vornehmen oder die Datenbank mit allen aktuellen Änderungen neu erstellen möchten. Der Weg über die grafischen Hilfsmittel ist in diesen Fällen ziemlich zeitaufwendig. Außerdem versetzt Sie die Kenntnis der SQL-Syntax für diese Abläufe in die Lage, Ihr Wissen auf andere Datenbanksysteme anzuwenden.


Die Syntax für die typische CREATE DATABASE-Anweisung sieht wie folgt aus:


Die Syntax der Anweisung CREATE DATABASE wollen wir nicht weiter vertiefen, da jedes System in dieser Hinsicht sein eigenes Süppchen kocht. Viele Systeme unterstützen nicht einmal einen SQL-Befehl wie CREATE DATABASE. Die populären und leistungsfähigeren relationalen Datenbank-Managementsysteme stellen ihn aber in der einen oder anderen Form bereit. Statt uns auf die Syntax zu konzentrieren, nutzen wir lieber die Zeit und gehen auf die Optionen beim Erstellen einer Datenbank ein.



CREATE DATABASE-Optionen

Wie bereits erwähnt, ist die Syntax der Anweisung CREATE DATABASE in den jeweiligen Implementierungen recht unterschiedlich. Viele Artikel zu SQL übergehen diese Anweisung und wenden sich direkt der Anweisung CREATE TABLE zu. Da man aber zunächst eine Datenbank braucht, bevor man eine Tabelle aufbauen kann, konzentriert sich der vorliegende Abschnitt auf einige Konzepte, die ein Entwickler beim Erstellen einer Datenbank beachten muß. Als erstes ist die Ebene der Zugriffsrechte ins Auge zu fassen. Unterstützt das relationale Datenbank-Managementsystem Benutzerberechtigungen, müssen Sie entweder über die Administrator-Berechtigungen verfügen oder vom Systemadministrator die Erlaubnis CREATE DATABASE erhalten. Genaueres entnehmen Sie bitte der Dokumentation zu Ihrem RDBMS.


In den meisten RDBMS läßt sich für die Datenbank eine Standardgröße - etwa in Mbyte verfügbarer Festplattenplatz - festlegen. Sie müssen wissen, wie Ihr Datenbanksystem die Daten auf der Festplatte speichert und lokalisiert, um die erforderliche Größe abschätzen zu können. Hauptsächlich ist der Systemadministrator dafür verantwortlich, diesen Platz zu verwalten. Vielleicht richtet er Ihnen auch eine Testdatenbank ein.


Lassen Sie sich von der Anweisung CREATE DATABASE nicht einschüchtern. Im einfachsten Fall kann man eine Datenbank namens ZAHLUNGEN mit der folgenden Anweisung erzeugen:


SQL> CREATE DATABASE ZAHLUNGEN;


Es sei noch einmal darauf hingewiesen, daß Sie sich mit der Dokumentation zu Ihrem Datenbank-Managementsystem befassen sollten, um die Besonderheiten beim Erstellen einer Datenbank in Erfahrung zu bringen, da sich die Anweisung CREATE DATABASE bei den konkreten Implementierungen unterscheidet und darüber hinaus jeweils über spezielle Optionen verfügt.


Datenbankentwurf

Der Erfolg einer Anwendung hängt nicht zuletzt vom richtigen Entwurf der zugehörigen Datenbank ab. Die einführenden Themen der ersten Lektion haben die relationale Datenbanktheorie und die Normalisierung von Datenbanken angerissen.


Unter Normalisierung versteht man die Aufteilung der Daten in separate Komponenten, um doppelte Informationen in einem oder mehreren Feldern einer Datenbanktabelle zu vermeiden. Mit jeder Normalisierungsstufe verringern sich die Wiederholungen. Dieser Prozeß kann recht kompliziert sein. Zahlreiche Werkzeuge für den Datenbankentwurf unterstützen ein zielgerichtetes Vorgehen.


Der Entwurf einer Datenbank ist von vielen Faktoren abhängig. Unter anderem sind folgende Punkte zu beachten:


Der erforderliche Platz auf der Festplatte stellt immer einen wichtigen Faktor dar. Auch wenn die Kapazität moderner Festplatten mehrere Gigabytes beträgt und die Platzprobleme etwas in den Hintergrund treten läßt, sollte man stets bedenken, daß die Abfrage einer Datenbank mit zunehmender Größe länger dauert. Nimmt man den Entwurf der Tabellenstruktur nur halbherzig vor, führt das fast zwangsläufig zu einer unnötig wiederholten Speicherung der Daten.


Es kann aber auch das entgegengesetzte Problem auftreten: Sie haben die Datenbank vollständig normalisiert und dabei viele Tabellen erzeugt. Obwohl die Grenze des Machbaren erreicht ist, dauern alle Abfragen bezüglich dieser Datenbank unendlich lange. Derartig »zerpflückte« Datenbanken sind schwer zu verwalten, da die gutgemeinten Absichten des Entwicklers von der komplizierten Tabellenstruktur verdeckt werden. Das weist auch auf die Notwendigkeit hin, den Code oder den Entwurf umfassend zu dokumentieren, damit andere Mitarbeiter das von Ihnen begonnene Werk fortsetzen (oder mit Ihnen zusammenarbeiten) können und eine klare Vorstellung Ihrer Absichten in bezug auf die zugrundeliegende Datenbankstruktur erhalten. Der Datenbankentwickler bezeichnet diese Dokumentation als Data Dictionary oder Systemkatalog.



Einen Systemkatalog erzeugen

Der Systemkatalog als wichtigste Form der Dokumentation ...


Viele Werkzeuge der rechnerunterstützten Softwareentwicklung (CASE - Computer-Aided Software Engineering) helfen dem Datenbankentwickler beim Erstellen dieses Systemkatalogs. Beispielsweise gehört zu Microsoft Access der sogenannte Dokumentierer, der die detaillierte Beschreibung aller oder ausgewählter Datenbankobjekte ausgibt. Tag 17 geht im Zusammenhang mit der Generierung von SQL-Anweisungen näher auf den Systemkatalog ein.


Zum Lieferumfang der verbreiteten RDBMS-Pakete gehören entweder ein installierter Systemkatalog oder Skripts zum Installieren.


Schlüsselfelder erzeugen

Neben der Dokumentation des Datenbankentwurfs gehört die Entwicklung einer Tabellenstruktur zu den wichtigsten Entwurfsaufgaben. Dabei sollte man eine Struktur anstreben, in der jede Tabelle über einen Primärschlüssel und einen Fremdschlüssel verfügt.


Für den Primärschlüssel gelten folgende Ziele:


Hinsichtlich des zweiten Ziels bezeichnet man die Spalte, deren Daten in der gesamten Tabelle eindeutig sind, als Primärschlüsselfeld. Ein Fremdschlüsselfeld ist ein Feld, das auf den Primärschlüssel oder Fremdschlüssel einer anderen Tabelle Bezug nimmt. Das folgende Beispiel soll diese Situation anhand der drei Tabellen RECHNUNGEN, BANKKONTEN und FIRMA verdeutlichen. Tabelle 9.1 zeigt das Format dieser drei Tabellen.


Tabelle 9.1: Tabellenstruktur für die Datenbank ZAHLUNGEN

RECHNUNGEN

BANKKONTEN

FIRMA

NAME, CHAR(30)
BETRAG, NUMBER
KONTO_ID, NUMBER

KONTO_ID, NUMBER
TYP, CHAR(30)
SALDO, NUMBER
BANK, CHAR(30)

NAME, CHAR(30)
ADRESSE, CHAR(50)
STADT, CHAR(20)
STAAT, CHAR(2)

Nehmen Sie sich etwas Zeit, um diese Tabellen zu studieren. Welche Felder kommen als Primärschlüssel in Frage? Welche eignen sich als Fremdschlüssel?


Der Primärschlüssel in der Tabelle RECHNUNGEN ist das Feld NAME. Dieses Feld sollte nicht doppelt vorkommen, da man nur eine Rechnung mit diesem Betrag hat. (In der Praxis verfügt man wahrscheinlich über eine Schecknummer oder ein Datum, um diesen Datensatz tatsächlich eindeutig zu machen. Hier nehmen wir einfach an, daß das Feld NAME diesen Zweck erfüllt.) Das Feld KONTO_ID in der Tabelle BANKKONTEN dient als Primärschlüssel für diese Tabelle. In der Tabelle FIRMA ist der Primärschlüssel das Feld NAME.


Die Fremdschlüssel in diesem Beispiel lassen sich wahrscheinlich leicht herausfinden. In der Tabelle RECHNUNGEN verknüpft das Feld KONTO_ID die Tabelle RECHNUNGEN mit der Tabelle BANKKONTEN. Das Feld NAME in der Tabelle RECHNUNGEN verbindet die Tabelle RECHNUNGEN mit der Tabelle FIRMA. Bei einem ausgewachsenen Datenbankentwurf hätte man es mit weit mehr Tabellen und einer stärkeren Aufteilung der Daten zu tun. Beispielsweise könnte das Feld BANK in der Tabelle BANKKONTEN auf eine Tabelle BANK zeigen, die Bankinformationen wie Adressen und Telefonnummern enthält. Die Tabelle FIRMA könnte mit einer anderen Tabelle (oder überhaupt mit einer anderen Datenbank) verknüpft sein, die Informationen über die Firma und deren Produkte enthält.


Übung 9.1

Sehen Sie sich nun einen ungeeigneten Datenbankentwurf an, der mit den gleichen Informationen wie in den Tabellen RECHNUNGEN, BANKKONTEN und FIRMA arbeitet. Ein Fehler, der vielen Einsteigern unterläuft, ist das fehlende Aufteilen der Daten in möglichst viele logische Gruppen. Zum Beispiel kann eine schlecht gestaltete Tabelle RECHNUNGEN wie folgt aussehen:


Spaltennamen

Bemerkung

NAME, CHAR(30)

Name der Schuldnerfirma

BETRAG, NUMBER

Betrag der Rechnung in Dollar

KONTO_ID, NUMBER

Kontokennung der Rechnung (verknüpft mit der Tabelle BANKKONTEN)

STADT, CHAR(15)

Stadt der Schuldnerfirma

STAAT, CHAR(2)

Staat der Schuldnerfirma

Auf den ersten Blick scheint das in Ordnung zu gehen, aber sehen Sie sich einmal die Daten genauer an. Wenn man über mehrere Monate hinweg Rechnungen an die Firma im Feld NAME schreibt, werden bei jedem neuen Eintrag eines Datensatzes für eine Rechnung die Informationen für die Felder ADRESSE, STADT und STAAT wiederholt. Stellen Sie sich das Ganze bei Hunderten oder Tausenden von Datensätzen vor und übertragen Sie das auf 10, 20 oder 30 Tabellen. Hier wird die Bedeutung einer passenden Normalisierung der Datenbank deutlich.


Bevor man diese Tabellen tatsächlich mit Daten füllen kann, muß man wissen, wie man eine Tabelle erzeugt.



Die Anweisung CREATE TABLE

Im Gegensatz zur Anweisung CREATE DATABASE fallen die Syntaxformen für das Erstellen einer Tabelle in den einzelnen Implementierungen schon einheitlicher aus. Die grundlegende Syntax für die Anweisung CREATE TABLE lautet:


Dazu ein einfaches Beispiel.


SQL> CREATE TABLE RECHNUNGEN (
2 NAME CHAR(30),
3 BETRAG NUMBER,
4 KONTO_ID NUMBER);

Tabelle wurde angelegt.


Diese Anweisung erzeugt eine Tabelle namens RECHNUNGEN mit den drei Feldern NAME, BETRAG und KONTO_ID. Das Feld NAME ist als Zeichentyp für die Aufnahme von bis zu 30 Zeichen deklariert. Die Felder BETRAG und KONTO_ID können nur Zahlenwerte aufnehmen.

Der nächste Abschnitt untersucht die Komponenten des Befehls CREATE TABLE.



Tabellennamen

Wenn man eine Tabelle mit Personal Oracle8 erstellt, sind einige Einschränkungen bei der Benennung der Tabelle zu beachten. Als erstes darf der Tabellenname nicht länger als 30 Zeichen sein. Da Oracle die Groß-/Kleinschreibung nicht beachtet, kann man sowohl Groß- als auch Kleinbuchstaben für die einzelnen Zeichen verwenden. Das erste Zeichen des Namens muß ein Buchstabe zwischen A und Z sein. Daran können sich Buchstaben oder die Symbole _, #, $ und @ anschließen. Natürlich muß der Tabellenname innerhalb seines Schemas eindeutig sein. Der Name darf auch nicht aus einem der reservierten Wörter von Oracle oder SQL bestehen (beispielsweise SELECT).


Doppelte Tabellennamen sind zulässig, solange der Eigentümer oder das Schema verschieden ist. Tabellennamen im selben Schema müssen eindeutig sein.


Feldnamen

Die gleichen Einschränkungen wie für Tabellennamen gelten auch für Feldnamen. Allerdings dürfen Feldnamen innerhalb der Datenbank mehrfach vorkommen. Die Einschränkung bezieht sich nur auf eindeutige Feldnamen innerhalb der betreffenden Tabelle. Gibt es zum Beispiel in einer Datenbank die Tabellen TABELLE1 und TABELLE2, dürfen beide Tabellen über Felder namens ID verfügen. Allerdings kann man in TABELLE1 nicht zwei Felder mit dem Namen ID vorsehen, selbst wenn diese unterschiedliche Datentypen aufweisen.



Felddatentypen

Wenn Sie bereits in irgendeiner Programmiersprache gearbeitet haben, ist Ihnen das Konzept der Datentypen geläufig, die in einem bestimmten Feld gespeichert werden. Beispielsweise richtet ein Zeichendatentyp ein Feld ein, das nur Zeichenketten (Strings) speichert. Tabelle 9.2 zeigt die von Personal Oracle8 unterstützten Datentypen.


Tabelle 9.2: Von Personal Oracle8 unterstützte Datentypen

Datentyp

Bemerkung

CHAR

Alphanumerische Daten mit einer Länge von 1 bis 255 Zeichen. Sind die Daten kürzer als die spezifizierte Länge, wird das Feld nach rechts mit Leerzeichen aufgefüllt.

DATE

Die Datumsangaben in diesem Datentyp umfassen Jahrhundert, Jahr, Monat, Tag, Stunde, Minute und Sekunde.

LONG

Alphanumerische Zeichenfolgen variabler Länge mit einer maximalen Größe von 2 Gbyte. (Siehe dazu den anschließenden Hinweis.)

LONG RAW

Binärdaten mit einer maximalen Größe von 2 Gbyte. (Siehe dazu den anschließenden Hinweis.)

NUMBER

Numerische Werte wie Null, positive oder negative Fest- oder Gleitkommazahlen.

RAW

Binärdaten mit einer maximalen Größe von 255 Byte.

ROWID

Hexadezimale Zeichendarstellung für die eindeutige Adresse einer Tabellenzeile. (Siehe dazu den folgenden Hinweis.)

VARCHAR2

Alphanumerische Daten mit variabler Länge von mindestens 1 und höchstens 2000 Zeichen.

Der Datentyp LONG wird in anderen Datenbank-Managementsystemen auch als Datentyp MEMO bezeichnet. Man verwendet ihn hauptsächlich zur Speicherung größerer Texte, die man zu einem späteren Zeitpunkt abrufen möchte.

Der Datentyp LONG RAW heißt in anderen Datenbank-Managementsystemen auch Binary Large Object (BLOB) und nimmt normalerweise Grafik-, Sound- oder Videodaten auf. Obwohl relationale Datenbank-Managementsysteme ursprünglich nicht für die Speicherung dieser Datentypen vorgesehen waren, speichern heute viele Multimediasysteme ihre Daten in Feldern vom Typ LONG RAW bzw. BLOB.

Mit dem Feldtyp ROWID läßt sich jedem Datensatz in einer Tabelle ein eindeutiger, nicht doppelt vorkommender Wert zuweisen. Andere Datenbanksysteme unterstützen dieses Konzept mit einem AutoWert- bzw. COUNTER-Feld (Microsoft Access) oder einem IDENTITY-Feld (SQL Server).

Konsultieren Sie bitte Ihre Dokumentation hinsichtlich der unterstützten Datentypen.


Der Wert NULL

Mit SQL kann man auch festlegen, welche Werte eine Spalte speichern darf. Der Begriff NULL-Wert ist fast ein Oxymoron (in der Art »beredtes Schweigen«), da ein Feld mit einem Wert von NULL eigentlich keinen Wert enthält.


In den meisten Datenbanksystemen läßt sich beim Aufbau einer Tabelle eine Spalte mit den Schlüsselwörtern NOT NULL kennzeichnen. NOT NULL bedeutet, daß kein Datensatz in der betreffenden Spalte einen NULL-Wert enthalten darf. Anders ausgedrückt muß jeder Datensatz einen echten Wert in der mit NOT NULL spezifizierten Spalte aufweisen. Das folgende Beispiel zeigt die Verwendung der Schlüsselwörter NOT NULL.


SQL> CREATE TABLE RECHNUNGEN (
2 NAME CHAR(30) NOT NULL,
3 BETRAG NUMBER,
4 KONTO_ID NUMBER NOT NULL);


In dieser Tabelle soll der Name der Firma zusammen mit dem fälligen Rechnungsbetrag gespeichert werden. Sollten die Angaben im Feld NAME und/oder im Feld KONTO_ID fehlen, wäre der Datensatz bedeutungslos - eine Rechnung, bei der man den Zahlungsempfänger nicht kennt.

Die erste Anweisung im nächsten Beispiel fügt einen gültigen Datensatz ein, der die Daten für eine Rechnung an Joe's Computer Service in Höhe von $25 enthält.


SQL> INSERT INTO RECHNUNGEN VALUES('Joe''s Computer Service',25,1);

1 Zeile wurde erstellt.

SQL> INSERT INTO RECHNUNGEN VALUES('',25000,1);

1 Zeile wurde erstellt.


Beachten Sie, daß der zweite Datensatz im obigen Beispiel keinen Wert für das Feld NAME enthält. (Auch wenn Sie der Meinung sind, daß ein fehlender Zahlungsempfänger bei einer Summe von immerhin $25000 gar nicht so ungelegen kommt, wollen wir diesen Fall hier nicht betrachten.) Wurde die Tabelle mit einem NOT NULL-Wert für das Feld NAME erstellt, liefert die zweite INSERT-Anweisung den Fehler:

INSERT INTO RECHNUNGEN VALUES('',25000,1)
*
FEHLER in Zeile 1:
ORA-01400: Einfügen von NULL in ("PERKINS"."RECHNUNGEN"."NAME") nicht möglich


Generell sollten das Primärschlüsselfeld und alle Fremdschlüsselfelder keine NULL-Werte enthalten.



Eindeutige Felder

Beim Datenbankentwurf sollte man bestrebt sein, in jeder Tabelle eine eindeutige Spalte vorzusehen. Diese Spalte (bzw. das Feld) dient als Primärschlüsselfeld. Während einige Datenbank-Managementsysteme die Deklaration eines eindeutigen Felds gestatten, bieten andere DBMS wie Oracle und SQL Server die Möglichkeit, einen eindeutigen Index auf einem Feld zu erzeugen. (Siehe dazu Tag 10.) Damit wird das Einfügen doppelter Schlüsselfeldwerte in die Datenbank verhindert.


Bei der Wahl des Schlüsselfelds sind mehrere Punkte zu beachten. Wie bereits erwähnt, stellt Oracle ein Feld ROWID bereit, das für jede hinzugefügte Zeile inkrementiert wird. Damit ist dieses Feld per Vorgabe immer ein eindeutiger Schlüssel. ROWID-Felder bieten sich aus mehreren Gründen als Schlüsselfelder an. Erstens läßt sich ein ganzzahliger Wert wesentlich schneller verknüpfen als ein 80 Zeichen langer String. Auf lange Sicht reduzieren ganzzahlige Werte statt langen CHAR-Werten in allen Haupt- und Fremschlüsselfeldern bei derartigen Verknüpfungen die Datenbankgröße. Als weiteren Vorteil bieten ROWID-Felder die Möglichkeit, die Organisation einer Tabelle zu ermitteln. Außerdem bringt die Verwendung von CHAR-Werten eine Reihe von Problemen bei der Dateneingabe mit sich. Was passiert zum Beispiel, wenn eine Person 111 First Street und eine andere 111 1st Street und noch eine andere 111 First St. eingibt? Bei den heutigen grafischen Benutzeroberflächen könnte man die korrekte Zeichenfolge in ein Listenfeld eintragen und dem Benutzer die Auswahl aus diesem Listenfeld anbieten. Per Programm konvertiert man dann den gewählten String in eine eindeutige ID und speichert diese in der Datenbank.


Nunmehr können Sie die Tabellen erstellen, die bereits weiter vorn zum Einsatz gekommen sind. Da wir auch im weiteren Verlauf dieses Kapitels auf diese Tabellen zurückgreifen, sollten Sie sie mit einigen Daten füllen. Nehmen Sie den gestern behandelten Befehl INSERT, um die Tabellen mit den Daten der Tabellen 9.3, 9.4 und 9.5 zu laden.


SQL> CREATE DATABASE ZAHLUNGEN


SQL> CREATE TABLE RECHNUNGEN (
2 NAME CHAR(30) NOT NULL,
3 BETRAG NUMBER,
4 KONTO_ID NUMBER NOT NULL);

Tabelle wurde angelegt.

SQL> CREATE TABLE BANKKONTEN (
2 KONTO_ID NUMBER NOT NULL,
3 TYP CHAR(30),
4 SALDO NUMBER,
5 BANK CHAR(30));

Tabelle wurde angelegt.

SQL> CREATE TABLE FIRMA (
2 NAME CHAR(30) NOT NULL,
3 ADRESSE CHAR(50),
4 STADT CHAR(30),
5 STAAT CHAR(2));

Tabelle wurde angelegt.


Tabelle 9.3: Beispieldaten für die Tabelle RECHNUNGEN

NAME

BETRAG

KONTO_ID

Phone Company

125

1

Power Company

75

1

Record Club

25

2

Software Company

250

1

Cable TV Company

35

3

Tabelle 9.4: Beispieldaten für die Tabelle BANKKONTEN

KONTO_ID

TYP

SALDO

BANK

1

Checking

500

First Federal

2

Money Market

1200

First Investor's

3

Checking

90

Credit Union

Tabelle 9.5: Beispieldaten für die Tabelle FIRMA

NAME

ADRESSE

STADT

STAAT

Phone Company

111 1st Street

Atlanta

GA

Power Company

222 2nd Street

Jacksonville

FL

Record Club

333 3rd Avenue

Los Angeles

CA

Software Company

444 4th Drive

San Francisco

CA

Cable TV Company

555 5th Drive

Austin

TX


Eine Tabelle speichern und in der Größe ändern

Die meisten großen RDBMS verfügen über Standardeinstellungen für Größe und Position von Tabellen. Wenn man diese Parameter nicht explizit festlegt, nimmt die zu erzeugende Tabelle Standardwerte an. Allerdings dürften die Standardwerte insbesondere bei großen Tabellen nicht immer Ihren Ansprüchen genügen. Die als Standard eingesetzten Größen und Positionen sind von der konkreten Implementierung abhängig. Das folgende Beispiel zeigt die Anweisung CREATE TABLE mit einer STORAGE-Speicherklausel (aus Oracle).


SQL> CREATE TABLE Tabellenname
2 (Spalte1 CHAR NOT NULL,
3 Spalte2 NUMBER,
4 Spalte3 DATE)
5 TABLESPACE Tabellenbereich
6 (STORAGE
7 INITIAL Wert
8 NEXT Wert
9 MINEXTENTS Wert
10 MAXEXTENTS Wert
11 PCTINCREASE Wert);


Tabelle wurde angelegt.


In Oracle läßt sich ein Tabellenbereich angeben, in dem man die Tabelle unterbringen möchte. Die Entscheidung trifft in der Regel der Datenbank-Administrator anhand des verfügbaren Platzes. Die anfängliche Größe der Tabelle (den zu Beginn zugewiesenen Platz) legt man mit INITIAL fest. NEXT ist der Wert für jede zusätzliche Erweiterung, die die Tabelle bei ihrem Wachstum erhält. Bei INITIAL und NEXT bezeichnet Wert eine ganze Zahl mit optional nachgestelltem K oder M. MINEXTENTS und MAXEXTENTS kennzeichnen die zulässigen Mindest- und Maximalgrößen für die Tabelle. Mit PCTINCREASE gibt man den Prozentsatz der nächsten Erweiterung an, wenn die Tabelle wächst oder eine andere Größe annimmt. Bei den letzten drei Parametern ist Wert eine ganze Zahl.


Eine Tabelle aus einer vorhandenen Tabelle erzeugen

In der Regel erzeugt man eine Tabelle mit dem Befehl CREATE TABLE. Allerdings bieten manche Datenbank-Managementsysteme für das Erzeugen von Tabellen eine alternative Methode, bei der sich das Format und die Daten einer vorhandenen Tabelle übernehmen lassen. Diese Methode bietet sich an, wenn man die Daten aus einer Tabelle wegen einer temporären Modifikation selektieren oder eine ähnliche Tabelle erstellen und mit ähnlichen Daten füllen möchte. (Man muß diese Informationen dann nicht noch einmal eingeben.)


Die Syntax dieser Variante der Anweisung CREATE TABLE lautet für das Oracle-System:


Mit dieser Syntax erzeugt man eine neue Tabelle, in der dieselben Daten der aus der alten Tabelle ausgewählten Felder enthalten sind. Darüber hinaus kann man die Felder in der neuen Tabelle umbenennen, indem man ihnen neue Namen gibt.


SQL> CREATE TABLE RECH_NEU(NAME, BETRAG, KONTO_ID)
2 AS (SELECT * FROM RECHNUNGEN WHERE BETRAG < 50);

Tabelle wurde angelegt.


Diese Anweisung erzeugt eine neue Tabelle (RECH_NEU) mit allen Datensätzen aus der Tabelle RECHNUNGEN, die einen BETRAG kleiner als 50 aufweisen.

Bei einigen Datenbanksystemen kann man mit der folgenden Syntax arbeiten:


Diese Syntax erzeugt eine neue Tabelle mit exakt der gleichen Feldstruktur und den gleichen Daten, die in der alten Tabelle vorhanden sind. Das folgende Beispiel zeigt diese Methode in der Sprache Transact-SQL von SQL Server.


INSERT RECH_NEU
1> select * from RECHNUNGEN where BETRAG < 50
2> go


(Die Anweisung GO in SQL Server verarbeitet die SQL-Anweisungen im Puffer der Befehlszeile. Diese Anweisung entspricht dem Semikolon in Oracle8.)



Die Anweisung ALTER TABLE

Oftmals entspricht der Datenbankentwurf noch nicht allen Ansprüchen. Außerdem unterliegen die Anforderungen an Anwendungen und Datenbanken einer stetigen Änderung. Die Anweisung ALTER TABLE erlaubt dem Datenbank-Administrator oder dem Entwickler, die Struktur einer Tabelle im nachhinein zu verändern.


Mit dem Befehl ALTER TABLE läßt sich ...


Die Syntax für den Befehl ALTER TABLE lautet:


Der folgende Befehl ändert das Feld NAME der Tabelle RECHNUNGEN für die Aufnahme von 40 Zeichen:


SQL> ALTER TABLE RECHNUNGEN
2 MODIFY NAME CHAR(40);
Tabelle wurde geändert.


Man kann die Länge von Spalten erhöhen oder verringern. Wenn jedoch die aktuelle Größe irgendeines Spaltenwerts größer als die neu zuzuweisende Länge ist, läßt sich die Länge der Spalte nicht verringern.

Die nächste Anweisung fügt eine neue Spalte in die Tabelle RECH_NEU ein:


SQL> ALTER TABLE RECH_NEU
2 ADD KOMMENTARE CHAR(80);
Tabelle wurde geändert.


Diese Anweisung fügt die neue Spalte KOMMENTARE mit einer Länge von 80 Zeichen ein. Das Feld wird rechts von allen vorhandenen Feldern angefügt.

Bei der Anweisung ALTER TABLE sind mehrere Einschränkungen zu beachten. Mit dieser Anweisung ist es nicht möglich, Felder in eine Datenbank einzufügen oder daraus zu löschen. Eine Spalte läßt sich zwar von NOT NULL in NULL ändern, aber nicht unbedingt in umgekehrter Richtung. Die Änderung der Spezifikation von NULL in NOT NULL funktioniert nur, wenn die Spalte keine NULL-Werte enthält.


Die Syntax für eine Änderung von NOT NULL in NULL lautet:


Um eine Spalte von NULL in NOT NULL zu ändern, muß man gegebenenfalls mehrere Schritte ausführen:


1. Ermitteln, ob die Spalte NULL-Werte enthält.


2. Alle gefundenen NULL-Werte behandeln (beispielsweise die betreffenden Datensätze löschen oder die Spaltenwerte aktualisieren).


3. Den Befehl ALTER TABLE ausführen.


Bestimmte Datenbank-Managementsysteme erlauben die Verwendung der Klausel MODIFY, andere Systeme nicht. Wieder andere Systeme halten andere Klauseln für die Anweisung ALTER TABLE bereit. In Oracle kann man sogar die Speicherparameter der Tabelle ändern. Die konkrete Implementierung der Anweisung ALTER TABLE entnehmen Sie bitte der Dokumentation Ihres Datenbanksystems.


Die Anweisung DROP TABLE

Mit DROP TABLE stellt SQL einen Befehl zum vollständigen Löschen einer Tabelle aus einer Datenbank bereit. Die Tabelle wird zusammen mit allen zugehörigen Sichten und Indizes gelöscht. (Einzelheiten dazu finden Sie in Lektion 10.) Die Ausführung dieses Befehls ist unwiderruflich. Den Befehl DROP TABLE setzt man vor allem beim Löschen einer temporär erzeugten Tabelle ein.


Wenn Sie alle mit der Tabelle vorgesehenen Operationen abgeschlossen haben, führen Sie die Anweisung DROP TABLE mit der folgenden Syntax aus:


Die Tabelle RECH_NEU löschen Sie zum Beispiel wie folgt:


SQL> DROP TABLE RECH_NEU;

Tabelle wurde gelöscht.


Beachten Sie das Fehlen einer Bestätigungsaufforderung. Nach Ausführen des Befehls DROP TABLE wird die Tabelle dauerhaft gelöscht.

Wenn man den Befehl

SQL> DROP TABLE RECH_NEU;


ausführt, kann man versehentlich auch die falsche Tabelle löschen. Beim Löschen von Tabellen sollte man immer den Namen des Eigen-tümers oder des Schemas verwenden. Die empfohlene Syntax lautet


SQL> DROP TABLE EIGENTUEMER.RECH_NEU;


Wir weisen hier ausdrücklich auf diese Syntax hin, da wir selbst einmal eine Produktionsdatenbank reparieren mußten, aus der eine falsche Tabelle gelöscht wurde. Die Tabelle war nicht mit dem Schemanamen spezifiziert. Die Wiederherstellung der Datenbank nahm acht Stunden in Anspruch, und wir mußten uns die ganze Nacht um die Ohren schlagen.



Die Anweisung DROP DATABASE

In mehreren Datenbank-Managementsystemen gibt es die Anweisung DROP DATABASE (Datenbank löschen), die man analog zur Anweisung DROP TABLE einsetzt. Die Syntax für diese Anweisung lautet wie folgt:


Die Datenbank RECHNUNGEN sollten Sie nicht löschen, da sie noch in der heutigen Lektion sowie in Lektion 10 zum Einsatz kommt.


Die Implementierungen der verschiedenen relationalen Datenbanken erfordern unter Umständen zusätzliche Schritte beim Löschen einer Datenbank. Gegebenenfalls muß man nach dem Löschen noch die Dateien, aus denen sich die Datenbank aufbaut, auf der Ebene des Betriebssystems entfernen.

Übung 9.2

Erzeugen Sie eine Datenbank mit einer Tabelle. Führen Sie den Befehl DROP TABLE und den Befehl DROP DATABASE aus. Erlaubt Ihnen Ihr Datenbanksystem diese Operationen? Systeme wie Microsoft Access, bei denen die Datenbank in einer einzigen Datei enthalten ist, unterstützen diesen Befehl nicht. Eine Datenbank läßt sich nur über die im Produkt selbst gebotenen Menübefehle erzeugen. Zum Löschen einer Datenbank muß man einfach die betreffende Datei von der Festplatte löschen.



Zusammenfassung

Tag 9 hat die wesentlichen Merkmale der Datenmanipulationssprache von SQL behandelt. Insbesondere haben Sie fünf neue Anweisungen kennengelernt: CREATE DATABASE, CREATE TABLE, ALTER TABLE, DROP TABLE und DROP DATABASE. Die heutige Lektion hat auch die Bedeutung eines guten Datenbankentwurfs hervorgehoben.


Ein Systemkatalog (oder Data Dictionary) ist einer der wichtigsten Teile der Dokumentation, die Sie beim Erstellen einer Datenbank anlegen. Der Systemkatalog sollte eine umfassende Beschreibung aller Objekte in der Datenbank enthalten: Tabellen, Felder, Sichten, Indizes, gespeicherte Prozeduren, Trigger usw. Ein vollständiger Systemkatalog erläutert auch kurz den Zweck, den die einzelnen Elemente in der Datenbank erfüllen. Bei jeder Änderung an der Datenbank sollte man den Systemkatalog auf den neuesten Stand bringen.


Bevor man irgendwelche Anweisungen zur Datenmanipulation verwendet, sollte man zunächst einen guten Datenbankentwurf erstellen. Gliedern Sie die Informationen in logische Gruppen, und arbeiten Sie ein Feld für den Primärschlüssel heraus, über das andere Gruppen (oder Tabellen) auf die logischen Gruppen Bezug nehmen können. Verwenden Sie Fremdschlüsselfelder, um auf die Primär- oder Fremdschlüsselfelder in anderen Tabellen zu zeigen.


Die Anweisung CREATE DATABASE gehört nicht zu den Standardelementen in Datenbanksystemen. Das hängt mit den verschiedenartigen Organisationsformen zusammen, mit denen die Hersteller eine Datenbank auf dem Datenträger speichern. Jede Implementierung bietet andere Funktionen und Optionen, was in einer gänzlich anderen CREATE DATABASE-Anweisung resultiert. Wenn man einfach den Befehl CREATE DATABASE Datenbankname ausführt, erzeugen die meisten Systeme eine Standarddatenbank mit einer Standardgröße. Die Anweisung DROP DATABASE löscht eine Datenbank permanent.


Mit der Anweisung CREATE TABLE erzeugt man eine neue Tabelle. Bei diesem Befehl kann man die erforderlichen Felder anlegen und deren Datentypen bestimmen. Manche Datenbank-Managementsysteme erlauben auch die Festlegung anderer Attribute für das Feld, beispielsweise, ob NULL-Werte zulässig sind, oder ob dieses Feld die gesamte Tabelle hindurch eindeutig sein sollte. Die Anweisung ALTER TABLE kann die Struktur einer vorhanden Tabelle ändern. Mit der Anweisung DROP TABLE löscht man eine Tabelle aus einer Datenbank.



Fragen & Antworten

Frage:

Warum unterscheidet sich die Anweisung CREATE DATABASE so stark von einem System zum anderen?

Antwort:

Das hängt damit zusammen, daß das eigentliche Erstellen einer Datenbank auf den verschiedenen Datenbanksystemen unterschiedlich abläuft. Kleinere PC-basierte Datenbanken stützen sich gewöhnlich auf Dateien, die mit Anwendungsprogrammen erstellt wurden. Um die Datenbank auf einem großen Server aufzuteilen, werden die betreffenden Datenbankdateien einfach über mehrere Festplattenlaufwerke verteilt. Wenn Ihr Code auf diese Datenbanken zugreift, laufen keine Datenbankprozesse auf dem Computer ab, sondern die Anwendung greift direkt auf die Dateien zu. Leistungsfähigere Datenbanksysteme müssen sich sowohl der Verwaltung des Plattenplatzes als auch Problemen wie Sicherheit, Transaktionssteuerung und gespeicherte Prozeduren, die in der Datenbank selbst eingebettet sind, widmen. Wenn Ihre Anwendung auf eine Datenbank zugreift, verwaltet ein Datenbank-Server Ihre Anforderungen (zusammen mit vielen anderen Anforderungen) und gibt die Daten über eine manchmal komplexe Schicht von Middleware zurück. Auf diese Themen geht Woche 3 im Detail ein. Momentan sollten Sie wissen, wie Ihr Datenbank-Managementsystem die Datenbanken erzeugt und verwaltet.

Frage:

Kann ich eine Tabelle temporär erzeugen und dann automatisch löschen, sobald ich die Arbeit damit beendet habe?

Antwort:

Ja. Viele Datenbank-Managementsysteme unterstützen temporäre Tabellen. Derartige Tabellen werden nur zur vorübergehenden Nutzung angelegt und automatisch gelöscht, wenn der Benutzer die Arbeit damit beendet oder wenn man einen DROP TABLE-Befehl auslöst. Den Einsatz temporärer Tabellen behandelt Tag 14.

Frage:

Kann ich Spalten mit der Anweisung ALTER TABLE löschen?

Antwort:

Nein. Über den Befehl ALTER TABLE lassen sich nur Spalten innerhalb einer Tabelle hinzufügen oder modifizieren. Um Spalten zu entfernen, erzeugt man eine Tabelle mit dem gewünschten Format und selektiert dann die Datensätze aus der alten in die neue Tabelle.


Workshop


Kontrollfragen

1. Richtig oder falsch: Die Anweisung ALTER DATABASE wird oft verwendet, um die Struktur einer vorhandenen Tabelle zu modifizieren.


2. Richtig oder falsch: Der Befehl DROP TABLE ist funktionell äquivalent zum Befehl DELETE FROM <Tabellenname>.


3. Richtig oder falsch: Eine neue Tabelle nimmt man mit dem Befehl CREATE TABLE in eine Datenbank auf.


4. Was ist in der folgenden Anweisung falsch?


CREATE TABLE Tabelle_Neu (
ID NUMBER,
FELD1 char(40),
FELD2 char(80),
ID char(40);


5. Was ist in der folgenden Anweisung falsch?


ALTER DATABASE RECHNUNGEN (
FIRMA char(80));


6. Wer ist der Eigentümer einer neu erstellten Tabelle?


7. Welcher Datentyp eignet sich am besten, wenn man Daten variabler Länge in einer Zeichenspalte ablegt?


8. Dürfen Tabellennamen mehrfach vorkommen?



Übungen

1. Fügen Sie der Datenbank RECHNUNGEN zwei neue Tabellen namens BANK und KONTOTYP in einem beliebigen Format hinzu. Die Tabelle BANK sollte Informationen über das Feld BANK enthalten, das Sie in den Beispielen dieser Lektion in der Tabelle BANKKONTEN verwendet haben. Die Tabelle KONTOTYP soll Informationen über das Feld KONTOTYP in der Tabelle BANKKONTEN enthalten. Versuchen Sie, die Daten weitgehend zu reduzieren.


2. Ändern Sie bei den bis jetzt erzeugten fünf Tabellen - RECHNUNGEN, BANKKONTEN, FIRMA, BANK und KONTOTYP - die Tabellenstruktur, so daß als Schlüssel keine CHAR-Felder, sondern ID-Felder mit ganzen Zahlen zum Einsatz kommen.


3. Schreiben Sie auf der Grundlage Ihrer bisherigen Kenntnisse zu SQL-Verknüpfungen (siehe dazu Tag 6) verschiedene Abfragen, um die Tabellen in der Datenbank RECHNUNGEN zu verknüpfen.



Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH.
Elektronische Fassung des Titels: SQL in 21 Tagen, ISBN: 3-8272-2020-3


vorheriges KapitelTop Of PageInhaltsverzeichnisIndexInfoseitenächstes Kapitel