In diesem Kapitel werden wir alle SQL-Anweisungen für
die Datendefinition beschreiben. Zuerst werden alle
Datendefinitionsanweisungen für logische Objekte in zwei
Gruppen eingeteilt und erläutert. Die erste Gruppe beinhaltet
die Anweisungen zum Erstellen und die zweite die Anweisungen
zum Löschen der logischen Objekte.
Die Organisation der Datenwerte einer Datenbank basiert
auf einer Hierarchie verschiedener Objekte. Dazu gehören
Tabellen, Spalten, Reihen, Indexe und die Datenbank selbst.
Alle diese Objekte werden mit den Anweisungen für die
Datendefinition erzeugt.
In Kapitel 3 haben wir die Erstellung von Tabellen mit Hilfe
von frames gezeigt. In diesem Kapitel wird die Erstellung
der Tabelle und weiterer logischer Objekte mit Hilfe von
SQL-Anweisungen erklärt.
Das erste Objekt, das erzeugt werden muß, ist die Datenbank.
Das Erzeugen der Datenbank wird mit Hilfe des Dienstprogramms
createdb durchgeführt. Dieses Dienstprogramm ist in Kapitel
15 beschrieben.
Mit der SQL-Anweisung CREATE TABLE wird eine Tabelle mit
allen dazugehörigen Spalten und deren Datentypen erzeugt. Die
Syntax dieser Anweisung hat zwei Formen:
(1)
CREATE TABLE tab_nam(sp_name1 sp_typ1[,sp_name2 sp_typ2,..])
[with-klausel]
(2)
CREATE TABLE tab_nam(sp_name1 sp_typ1[,sp_name2 sp_typ2,..])
AS select_anw
[with-klausel]
tab_nam ist der Name der neuerstellten Tabelle. Die Tabelle
kann ab der Version 6.3 maximal 300 Spalten haben. Jede Reihe
der Tabelle darf maximal 2008 Byte lang sein. Der Name kann
gekennzeichnet sein. Vor dem Tabellennamen kann also der Name
des Benutzers, der die Tabelle erstellt hat, stehen. Der
Tabellenname darf nicht mit dem Zeichenpaar "ii" beginnen,
weil in INGRES das Präfix "ii" für systeminterne Dateien
reserviert ist.
sp_name1 ist der Spaltenname; er muß innerhalb der Tabelle,
in der sich die Spalte befindet, eindeutig sein. Dieser
Name kann auch dadurch gekennzeichnet sein, daß man den
Tabellennamen vor den Spaltennamen setzt: tab_nam.sp_name1.
Das Kennzeichnen eines Spaltennamens ist bei den Abfragen
notwendig, bei denen Tabellen, die gleichnamige Spalten
enthalten, miteinander verknüpft werden.
sp_typ1 bezeichnet den Datentyp und das Verhalten des Systems
während des Einfügens neuer Werte. Die möglichen Datentypen
sind in Kapitel 2 beschrieben. Beim Einfügen der Werte
existieren drei mögliche Angaben für den Fall, daß für eine
Spalte kein Wert explizit angegeben ist. Dies sind:
- WITH NULL,
- NOT NULL WITH
DEFAULT und
- NOT NULL NOT
DEFAULT .
WITH NULL besagt, daß der NULL-Wert implizit der Spalte
zugewiesen wird. Bei NOT NULL WITH DEFAULT wird der
Standardwert (0 für Spalten mit einem numerischen bzw. das
Leerzeichen für Spalten mit einem alphanumerischen Datentyp)
eingefügt. NOT NULL NOT DEFAULT verursacht die Ausgabe einer
Fehlermeldung, falls kein Wert explizit angegeben ist. Die
Voreinstellung ist WITH NULL. Falls NOT NULL angegeben ist,
wird NOT NULL NOT DEFAULT angenommen.
with-klausel beschreibt unterschiedliche Eigenschaften einer
Tabelle. Diese Klausel fängt immer mit dem Schlüsselwort WITH
und einer der folgenden Angaben an:
LOCATION = (...) ,
[NO]JOURNALING und
[NO]DUPLICATES.
Die Angabe LOCATION beschreibt ein oder mehrere
Plattenspeicherbereiche, in denen die erstellte Tabelle
gespeichert wird. JOURNALING verursacht die Sicherung des
ursprünglichen Inhalts aller modifizierten Reihen nach
einer Datenmanipulationsanweisung, während NOJOURNALING dies
unterläßt. DUPLICATES erlaubt die Existenz identischer Reihen
in einer Tabelle, während NODUPLICATES dies untersagt.
Die zweite Form der CREATE TABLE-Anweisung unterscheidet sich
von der ersten durch die Existenz einer SELECT-Anweisung,
mit der die erstellte Tabelle zusätzlich mit den Reihen aus
einer, in der SELECT-Anweisung angegebenen Tabelle geladen
wird.
In einer Datenbank können mehrere gleichnamige Tabellen
existieren, falls sie von verschiedenen Benutzern erstellt
wurden. INGRES unterscheidet zwischen öffentlichen und
privaten Tabellen. Die öffentlichen Tabellen werden von
dem Datenbankadministrator und die privaten von den
einzelnen Benutzern erstellt. Auf eine private Tabelle
kann grundsätzlich nur der Benutzer, der sie erstellt hat,
zugreifen.
Die Tabellen der Beispieldatenbank aus Kapitel 1 können
mit der CREATE TABLE-Anweisung auf folgende Weise erstellt
werden:
CREATE TABLE abteilung
(abt_nr
CHAR(4) NOT NULL ,
abt_name CHAR(20) NOT NULL,
stadt CHAR(15));
CREATE TABLE mitarbeiter
(m_nr INTEGER NOT NULL ,
m_name CHAR(20) NOT NULL,
m_vorname CHAR(20) NOT NULL,
abt_nr CHAR(4));
CREATE TABLE projekt
(pr_nr CHAR(4) NOT NULL ,
pr_name CHAR(25) NOT NULL,
mittel FLOAT8);
CREATE TABLE arbeiten
(m_nr INTEGER NOT NULL ,
pr_nr CHAR(4) NOT NULL,
aufgabe
CHAR(15),
einst_dat DATE);
Hinweis.
Alle interaktiven SQL-Anweisungen, die in diesem Buch als
Beispiele gegeben sind, können bei INGRES entweder mit dem
interaktiven SQL-System isql oder mit dem Dienstprogramm
sql erstellt und ausgeführt werden. isql ist eine
frame-basierte INGRES-Komponente, die entweder mit dem
Betriebssystemkommando isql oder durch die Auswahl der
Funktion Queries und der Unterfunktion sql im INGRES/MENU
aufgerufen wird.
Das Dienstprogramm sql hat dieselbe Funktionalität
wie isql , ist aber batch-orientiert und damit weniger
benutzerfreundlich. Dieses Dienstprogramm kann mit dem
Betriebssystemkommando sql aufgerufen werden.
Mit der Anweisungsfolge in Beispiel 6.1 werden vier Tabellen
der Beispieldatenbank erstellt. Das Zeichen ";" dient als
Begrenzer zwischen den SQL-Anweisungen.
Zusätzlich zu den schon erwähnten Tabellen, die auch als
Benutzer- bzw. Basistabellen bezeichnet werden, gibt es
spezielle Tabellen, die Views heißen. Die Basistabellen
existieren physikalisch, während Views virtuelle Tabellen
darstellen, die physikalisch nicht existieren und immer
aus der (den) darunterliegenden Tabelle(n) abgeleitet
werden. Die Anweisung CREATE VIEW erzeugt ein neues View
aus einer schon existierenden Basistabelle mittels einer
SELECT-Anweisung. Weil die SELECT-Anweisung die Basis für
CREATE VIEW ist, gehört CREATE VIEW eher zu den Anweisungen
für Datenmanipulationen als zu den Anweisungen für
Datendefinition. Aus diesem Grund werden wir Views erst
dann behandeln, wenn alle Anweisungen für Datenmanipulation
definiert und erklärt sind. Kapitel 11 ist ausschließlich dem
Thema Views gewidmet.
CREATE INDEX ist die Anweisung zur Erstellung der Indexe.
Der wichtigste Grund für die Erstellung eines Index steht
mit den Abfragen in Zusammenhang. Durch die Existenz eines
Index können die Antwortzeiten einer Abfrage wesentlich
beschleunigt werden. CREATE INDEX hat folgende Form
CREATE
[UNIQUE] INDEX ind_name ON tab_name
(sp_1 [ASC|DESC] [sp_2 [ASC|DESC],...])
[with-klausel];
Die ganze Problematik der Indexvergabe wird in Kapitel 12
ausführlich behandelt.
Im Unterschied zu den meisten anderen relationalen
Datenbanksystemen unterstützt INGRES keine SQL-Anweisung zur
Änderung der Struktur von Datenbankobjekten. Eine Änderung
der Speicherstruktur der Objekte kann mit der Anweisung
MODIFY durchgeführt werden, die in Kapitel 12 beschrieben
ist.
Alle SQL-Anweisungen, die das Löschen der Objekte einer
Datenbank veranlassen, haben folgende allgemeine Form:
DROP
objekt obj_name;
wobei objekt ein Objekt der Datenbank ist und obj_name den
Namen dieses Objektes darstellt.
Mit der Anweisung
DROP TABLE tab_name;
wird eine existierende Tabelle gelöscht. Das Löschen einer
Tabelle bedeutet, daß sie aus dem Systemkatalog entfernt
wird. Alle Reihen und Indexe, die dieser Tabelle angehören,
werden ebenso gelöscht.
Mit der Anweisung
DROP INDEX ind_name;
wird ein existierender Index gelöscht.
Mit der Anweisung
DROP VIEW view_name;
wird ein View gelöscht.
A.6.1 In Beispiel 6.1 sind einige Spalten der vier erstellten
Tabellen mit der NOT NULL-Angabe definiert. Für welche
Spalten ist diese Angabe unbedingt erforderlich und für
welche nicht?
A.6.2 Warum sind die Spalten m_nr und abt_nr als CHAR-Werte
(und nicht als numerische Werte) definiert?
A.6.3 Erstellen Sie die Tabelle systeme, die folgende Spalten
enthält:
sys_name - alphanumerisch, max. 15 Zeichen
version - Ganzzahl
hersteller - alphanumerisch, max. 20 Zeichen
ort - alphanumerisch, max. 20 Zeichen
A.6.4 Beschreiben Sie genau, was passiert, wenn eine Tabelle
mit der DROP TABLE-Anweisung gelöscht wird.