Base

Kapitel 3
Tabellen

Dokumentationen zu LibreOffice unter de.libreoffice.org

Copyright
Dieses Dokument unterliegt dem Copyright © 2012. Die Beitragenden sind unten aufgeführt. Sie
dürfen dieses Dokument unter den Bedingungen der GNU General Public License(http://www.gnu.org/licenses/gpl.html), Version 3 oder höher, oder der Creative Commons
Attribution License (http://creativecommons.org/licenses/by/3.0/), Version 3.0 oder höher,verändern und/oder weitergeben.
Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt.
Fast alle Hardware- und Softwarebezeichnungen und weitere Stichworte und sonstige Angaben,
die in diesem Buch verwendet werden, sind als eingetragene Marken geschützt.
Da es nicht möglich ist, in allen Fällen zeitnah zu ermitteln, ob ein Markenschutz besteht, wird das
Symbol (R) in diesem Buch nicht verwendet.

Mitwirkende/Autoren
Jochen Schiffers

Robert Großkopf

Jost Lange

Rückmeldung (Feedback)Kommentare oder Vorschläge zu diesem Dokument können Sie in deutscher Sprache an die
Adresse discuss@de.libreoffice.org senden.

Vorsicht

Alles, was an eine Mailingliste geschickt wird, inklusive der E-Mail-Adresse undanderer persönlicher Daten, die die E-Mail enthält, wird öffentlich archiviert und kannnicht gelöscht werden. Also, schreiben Sie mit Bedacht!

Datum der Veröffentlichung und Softwareversion
Veröffentlicht am 12.05.2012. Basierend auf der LibreOffice Version 3.5.

Anmerkung für Macintosh Nutzer
Einige Tastenbelegungen (Tastenkürzel) und Menüeinträge unterscheiden sich zwischen derMacintosh Version und denen für Windows- und Linux-Rechnern. Die unten stehende Tabelle gibt
Ihnen einige grundlegende Hinweise dazu. Eine ausführlichere Aufstellung dazu finden Sie in der
Hilfedatei des jeweiligen Moduls.
Windows/Linux

entspricht am Mac

EffektMenü-Auswahl Extras →Optionen

LibreOffice → EinstellungenZugriff auf die Programmoptionen

Rechts-Klick

Control+KlickÖffnen eines Kontextmenüs

Ctrl (Control)⌘ (Command)

Tastenkürzel in Verbindung mit anderen
TastenF5Shift+⌘+F5

öffnet den Dokumentnavigator Dialog

F11

⌘+T

öffnet den Formatvorlagen Dialog

oder Strg (Steuerung)2

TabellenInhalt
Allgemeines zu Tabellen ................................................................................................................ 4
Beziehung von Tabellen ................................................................................................................. 4
Tabellen und Beziehungen der Beispieldatenbank .................................................................... 6
Tabellen Medienaufnahme .................................................................................................... 7
Tabellen Ausleihe .................................................................................................................. 9
Tabellen Nutzerverwaltung .................................................................................................... 9
Erstellung von Tabellen ................................................................................................................ 10
Erstellung mit der grafischen Benutzeroberfläche .................................................................... 11
Einstellung eines Indexes ................................................................................................... 12
Mängel der grafischen Tabellenerstellung ........................................................................... 14
Direkte Eingabe von SQL-Befehlen ......................................................................................... 14
Tabellenerstellung ............................................................................................................... 15
Tabellenänderung ............................................................................................................... 18
Tabellen löschen ................................................................................................................. 20
Verknüpfung von Tabellen ............................................................................................................ 20
Eingabe von Daten in Tabellen ..................................................................................................... 24
Eingabe über die grafische Benutzeroberfläche der Tabelle .................................................... 25
Sortieren von Tabellen ........................................................................................................ 26
Suchen in Tabellen .............................................................................................................. 27
Filtern von Tabellen ............................................................................................................. 29
Eingabemöglichkeiten über SQL direkt .................................................................................... 31
Neue Datensätze einfügen .................................................................................................. 31
Bestehende Datensätze ändern .......................................................................................... 31
Bestehende Datensätze löschen ........................................................................................ 32
Mängel dieser Eingabemöglichkeiten ...................................................................................... 32

3

Allgemeines zu Tabellen
Dateien werden in Datenbanken innerhalb von Tabellen gespeichert. Wesentlicher Unterschied zu
Tabellen innerhalb einer einfachen Tabellenkalkulation ist, dass die Felder, in die geschrieben wird,
klar vordefiniert werden müssen. Eine Datenbank erwartet innerhalb einer Textspalte keine
Zahleneingaben, mit denen sie rechnen kann. Sie stellt die Zahlen dann zwar dar, geht aber voneinem Wert "0" für diese Zahlen aus. Auch Bilder lassen sich nicht in jeder Feldform ablegen.
Welche Datentypen es im einzelnen gibt, kann bei der grafischen Benutzeroberfläche dem
Tabelleneditor entnommen werden. Details dafür unter im Anhang dieses Handbuches.
Einfache Datenbanken beruhen lediglich auf einer Tabelle. Hier werden alle Daten unabhängig
davon eingegeben, ob eventuell mehrfache Eingaben des gleichen Inhaltes gemacht werden
müssen. Eine einfache Adressensammlung für den Privatgebrauch lässt sich so erstellen. Die
Adressensammlung einer Schule oder eines Sportvereins würde aber so viele Wiederholungen bei
Postleitzahl und Ort aufweisen, dass diese Tabellenfelder in eine oder sogar 2 separate Tabellenausgelagert würden. Die Auslagerung von Informationen in andere Tabellen hilft:•••

laufend wiederkehrende Eingaben gleichen Inhaltes zu reduzieren
Schreibfehler bei diesen laufenden Eingaben zu vermeiden
Daten besser nach den ausgelagerten Tabellen zu filtern

Bei der Erstellung der Tabellen sollte also immer wieder überlegt werden, ob eventuell viele
Wiederholungen vor allem von Texten oder Bildern (hier stecken die Speicherfresser) in den
Tabellen vorkommen. Dann empfiehlt sich eine Auslagerung der Tabelle. Wie dies prinzipiell geht
ist im Handbuch "Erste Schritte" → Kapitel "Einführung in Base" bereits beschrieben.

Beziehung von Tabellen
Anhand der Beispieldatenbanken "Medien_ohne_Makros" bzw. "Medien_mit_Makros" werden indiesem Handbuch viele Schritte möglichst detailliert erklärt. Bereits die Tabellenkonstruktion dieser
Datenbank ist sehr umfangreich, da sie neben der Aufnahme von Medien in eine Mediothek auchdie Ausleihe von Medien abdeckt.
Je mehr Tabellen in Beziehung zueinander stehen, desto komplexer kann der Entwurf sein. Das
folgende Bild zeigt die gesamte Tabellenstruktur der Beispieldatenbank in einer Übersicht, die vonder Größe her die Seite dieses Dokuments sprengt:

4

TabellenAbbildung 1: Beziehungsentwurf der Beispieldatenbank "Medien_ohne_Makros"
Eins-zu-viele Beziehungen:
Eine Datenbank für Medien listet in einer Tabelle die Titel der Medien auf. Da es für jeden Titel
unterschiedlich viele Untertitel gibt (manchmal auch gar keine) werden in einer gesonderten
Tabelle diese Untertitel abgespeichert. Dies ist als eine Eins-zu-viele-Beziehung (1:n) bekannt.
Einem Medium werden gegebenenfalls viele Untertitel zugeordnet, z.B. bei dem Medium
Musik-CD die vielen Musiktitel auf dieser CD. Der Primärschlüssel der Tabelle "Medien" wird
als Fremdschlüssel in der Tabelle "Untertitel" abgespeichert. Die meisten Beziehungenzwischen Tabellen in einer Datenbank sind Eins-zu-viele Beziehungen.

Abbildung 2: Beispiel 1:n-Beziehung; n:m-Beziehung
Viele-zu-viele Beziehungen:
Eine Datenbank für eine Bibliothek wird eine Tabelle für den Namen der Verfasser und eine
Tabelle für die Medien enthalten. Es gibt einen offensichtlichen Zusammenhang zwischen den
Verfasser und z.B. Büchern, die sie geschrieben haben. Die Bibliothek kann mehr als ein Buch

Beziehung von Tabellen5desselben Verfassers enthalten. Sie kann aber auch Bücher enthalten, die von mehreren
Verfassern stammen. Dies ist als eine Viele-zu-viele-Beziehung (n:m) bekannt. Solche
Beziehungen werden durch Tabellen gelöst, die als Mittler zwischen den beiden betroffenen
Tabellen eingesetzt werden. Dies ist in der obigen Abbildung die Tabelle"rel_Medien_Verfasser".
Praktisch wird also die n:m-Beziehung über zwei 1:n-Beziehungen gelöst. In der Mittlertabelle
kann die "Medien_ID" mehrmals erscheinen, ebenso die "Verfasser_ID". Dadurch, dass beide
zusammen den Primärschlüssel ergeben ist nur ausgeschlossen, dass zu einem Medium
wiederholt der gleiche Verfasser gewählt wird.
Eins-zu-Eins-Beziehung:Abbildung 3: Beispiel 1:1-Beziehung
Die bereits angesprochene Bibliotheks-Datenbank enthält eine Tabelle für die Leser. In dieser
Tabelle sind erst einmal nur die direkt notwendig erscheinenden Felder vorgesehen. Für eine
Datenbank im Bereich von Schulen würde noch die jeweilige Schulklasse benötigt. Über diese
Klasse kann gegebenenfalls auch die Adresse erfahren werden. Eine Aufnahme der Adresse in
die Datenbank ist also nicht notwendig. Die Klassenbeziehung des Schülers ist aus derLesertabelle ausgegliedert, weil nicht in allen Bereichen mit der Zuordnung zu Klassen etwas
angefangen werden kann. Dadurch entsteht eine 1:1-Beziehung zwischen Leser und seiner
ganz persönlichen Klassenzuweisung.
Handelt es sich um eine Datenbank im öffentlichen Bereich, so wird wohl die Adresse derLeser benötigt. Einem Leser wird hier genau eine Adresse zugeordnet. Würde es mehrere
Leser mit der gleichen Adresse geben, so müsste das bei dieser Konstruktion zu einer
Neueingabe der Adresse führen, denn der Primärschlüssel aus der Tabelle "Leser" wird direkt
als Primärschlüssel in die Tabelle "Adresse" eingetragen. Primärschlüssel und Fremdschlüssel
sind in der Tabelle "Adresse" eins. Hier besteht also eine 1:1-Beziehung.
Eine 1:1-Beziehung bedeutet nicht, dass automatisch zu jedem Datensatz der einen Tabelle
auch ein Datensatz der anderen Tabelle existiert. Es existiert allerdings höchstens ein
Datensatz. Durch die 1:1-Beziehung werden also Felder ausgelagert, die vermutlich nur bei
einem Teil der Datensätze mit Inhalt gefüllt sein werden.

Tabellen und Beziehungen der Beispieldatenbank
Die Beispieldatenbank muss drei verschiedene Aufgabenbereiche erfüllen. Zuerst einmal müssen
Medien in die Datenbank aufgenommen werden. Dies soll so erfolgen, dass auch eine Bibliothek
damit arbeiten kann. Für eine einfache Übersicht über die Medien, die zu Hause lagern, reichen
dagegen die Beispieldatenbanken aus dem Handbuch "Erste Schritte Base" aus.
6

TabellenTabellen Medienaufnahme
Zentrale Tabelle der Medienaufnahme ist die Tabelle Medien. In dieser Tabelle werden alle Felder
direkt verwaltet, die vermutlich nicht auch von anderen Medien mit dem gleichen Inhalt belegt
werden. Doppelungen sollen also vermieden werden.
Aus diesem Grund sind in der Tabelle z.B. der Titel, die ISBN-Nummer, ein Bild des Umschlags
oder das Erscheinungsjahr vorgesehen. Die Liste der Felder kann hier entsprechend erweitert
werden. So sehen Bibliotheken z.B. Felder für den Umfang (Seitenanzahl), den Reihentitel undähnlichem vor.
Die Tabelle Untertitel soll dazu dienen, z.B. den Inhalt von CDs im Einzelnen aufzunehmen. Da
auf einer CD mehrere Musikstücke (Untertitel) vorhanden sind würde eine Aufnahme derMusikstücke in die Haupttabelle dazu führen, dass entweder viele zusätzliche Felder (Untertitel 1,
Untertitel 2 usw.) erstellt werden müssten oder das gleiche Medium mehrmals hintereinander
eingegeben werden müsste. Die Tabelle Untertitel steht also in einer n:1-Beziehung zu der Tabelle
Medien.
Felder der Tabelle Untertitel sind neben dem Untertitel selbst die Nummerierung der Reihenfolge
der Titel und die Dauer der Untertitel. Das Feld Dauer ist erst einmal als ein Zeitfeld vorgesehen.
So kann gegebenenfalls die Gesamtdauer der CD in einer Übersicht berechnet und ausgegeben
werden.
Die Verfasser haben zu den Medien eine n:m-Beziehung. Ein Medium kann mehrere Verfasser
haben, ein Verfasser kann mehrere Medien herausgebracht haben. Dies wird mit der Tabelle
rel_Medien_Verfasser geregelt. Primärschlüssel dieser Verbindungstabelle sind die
Fremdschlüssel, die aus der Tabelle Verfasser und Medien ausgegeben werden. In der Tabelle
rel_Medien_Verfasser wird zusätzlich noch eine Sortierung der Verfasser vorgenommen (z.B. nachder Reihenfolge, wie sie im Buch genannt werden). Außerdem wird gegebenenfalls ein Zusatz wie"Herausgeber", "Fotograf" o.ä. dem jeweiligen Verfasser beigefügt.
Kategorie, Medienart, Ort und Verlag haben jeweils eine 1:n-Beziehung.
In der Kategorie kann bei kleinen Bibliotheken so etwas stehen wie "Kunst", "Biologie" … Bei
größeren Bibliotheken gibt es gängige Systematiken wie z.B. die ASB (allgemeine Systematik fürBibliotheken). Bei dieser Systematik gibt es Kürzel und ausführlichere Beschreibungen. Daher die
beiden Felder für die Kategorie.
Die Medienart ist gekoppelt mit der Ausleihzeit. So kann es z.B. sein, dass Video-DVDs
grundsätzlich nur eine Ausleihzeit von 1 Woche haben, Bücher aber eine von 3 Wochen. Wird die
Ausleihzeit an ein anderes Kriterium gekoppelt, so muss entsprechend anders verfahren werden.
Die Tabelle Ort dient nicht nur dazu, die Ortsbenennungen aus den Medien aufzunehmen. In ihr
werden gleichzeitig die Orte gespeichert, die für die Adressen der Nutzer Bedeutung haben.
Da der Verlag vermutlich auch häufiger vorkommt, ist für seine Eingabe ebenfalls eine gesonderte
Tabelle vorgesehen.

Beziehung von Tabellen

7Abbildung 4: Medienaufnahme
Die Tabelle Medien hat so insgesamt vier Fremdschlüssel und einen Primärschlüssel, der für 2Tabellen der Abbildung Medienaufnahme zum Fremdschlüssel wird.

8

TabellenTabellen Ausleihe

Abbildung 5: Ausleihe
Zentrale Tabelle ist die Ausleihe. In ihr werden die Tabellen Medien und Leser verknüpft. Da auch
später noch nachvollzogen werden soll, wer ein Buch ausgeliehen hat (falls z.B. jemand beim
Ausleihen bemerkt, dass das Buch beschädigt ist, oder falls eine Hitliste der Medien erstellt
werden soll) wird der Datensatz in der Ausleihe bei der Rückgabe nicht einfach gelöscht. Vielmehr
wird ein Rückgabedatum (Rueck_Datum) vermerkt.
Ebenso in die Ausleihe integriert ist das Mahnverfahren. Um die Anzahl der Mahnungen zu
erfassen wird jede Mahnung separat in der Tabelle Mahnung eingetragen.
Neben der Verlängerung um einzelne Wochen steht noch ein gesondertes Feld in der Ausleihe,
das es ermöglicht, Medien über einen Barcodescanner zu entleihen (Medien_ID_BC). Barcodes
enthalten neben der eigentlichen "Medien_ID" auch eine Prüfziffer, mit der das Gerät feststellen
kann, ob der eingelesene Wert korrekt ist. Dieses Barcodefeld ist hier nur testweise eingebaut.
Besser wäre es, wenn der Primärschlüssel der Tabelle Medien direkt in Barcode-Form eingegeben
würde oder per Makro aus der eingelesenen Barcodeziffer einfach die Prüfziffer vor dem
Abspeichern entfernt wird.
Schließlich ist noch der Leser mit der Ausleihe in Verbindung zu bringen. In der eigentlichen
Lesertabelle wird ledigĺich der Name, eine eventuelle Sperrung und ein Fremdschlüssel für eine
Verbindung zur Tabelle Geschlecht vorgesehen.

Tabellen Nutzerverwaltung
In dieser Tabellenkonstruktion werden gleich zwei Szenarien bedient. Der obere Tabellenstrang ist
dabei auf Schulen zugeschnitten. Hier werden keine Adressen benötigt, da die Schüler undSchülerinnen über die Schule selbst ansprechbar sind. Mahnungen müssen nicht postalischzugestellt werden, sondern auf dem internen Wege weitergegeben werden.
Der Adressstrang ist dagegen bei öffentlichen Bibliotheken notwendig. Hier müssen sämtliche
Daten erfasst werden, die zu Erstellung eines Mahnbriefes erforderlich sind.
Die Tabelle Geschlecht dient dazu, die richtige Anrede bei Mahnschreiben zu wählen. Die
Mahnschreiben sollen schließlich möglichst automatisiert erfolgen. Außerdem gibt es Vornamen,
die sowohl für männliche als auch für weibliche Leser stehen können. Deswegen ist die
Abspeicherung des Geschlechts auch bei der Erstellung von handgeschriebenen Mahnungensinnvoll.

Beziehung von Tabellen

9Abbildung 6: Leser - ein Schulklassenstrang und ein Adressenstrang
Die Tabelle rel_Leser_Schulklasse steht wie die Tabelle Adresse in einer 1:1-Beziehung zu derTabelle "Leser". Dies ist gewählt worden, weil entweder die eine oder die andere Möglichkeit
beschritten werden soll. Sonst könnte die "Schulklasse_ID" direkt in der Tabelle Schüler existieren;
gleiches gilt für den gesamten Inhalt der Tabelle Adresse.
Eine Schulklasse wird in der Regel durch eine Jahrgangsbezeichnung und einen Klassenzusatz
gekennzeichnet. Bei einer 4-zügigen Schule kann dieser Zusatz z.B. von a bis d gehen. Der
Zusatz wird in der Tabelle "Klasse" eingetragen. Der Jahrgang hat eine separate Tabelle. Sollen
am Schluss eines Schuljahres die Leser aufgestuft werden, so wird einfach der Jahrgang für alle
geändert.
Die Adresse wird ebenfalls sehr differenziert dargestellt. Die Straße ist aus der Adresse
ausgelagert, da Straßennahmen innerhalb eines Ortes häufiger wiederholt werden. Postleitzahl
und Ort sind voneinander getrennt, da oft mehrere Postleitzahlen für einen Ort gelten. Für die Postsind alle Ortsbezeichnungen, die auf die gleiche Postleitzahl passen, in einem Ort
zusammengefasst. Es existieren postalisch also deutlich mehr Postleitzahlen als Orte. So werden
von der Tabelle Adresse aus gesehen deutlich weniger Datensätze in der Tabelle Postleitzahl
stehen und noch einmal deutlich weniger Datensätze in der Tabelle Ort existieren.
Wie eine derartige Tabellenkonstruktion später sinnvoll zu befüllen ist, wird weiter unten im Kapitel
Formulare erläutert.

Erstellung von Tabellen
In der Regel wird sich der LibreOffice-User auf die Erstellung von Tabellen mit der grafischen
Benutzeroberfläche beschränken. Die direkte Eingabe von SQL-Befehlen ist dann sinnvoll, wennz.B. ein Tabellenfeld nachträglich an einer bestimmten Position eingefügt werden soll oderStandardwerte nach Abspeicherung der Tabelle noch gesetzt werden sollen.

10TabellenBezeichnungen bei Tabellen:

TabelleFeld(FIELD)(TABLE)

Spalte (COLUMN)

Spalte (COLUMN)

Feld
Typ
leer
Standard(TYPE) (NULL) (DEFAULT) (FIELD)

Typ
leer
Standard(TYPE) (NULL) (DEFAULT)

Zeile (ROW)

Datensatz

Die obige Skizze zeigt die allgemein übliche Aufteilung von Tabellen in Spalten und Zeilen. Die
entsprechenden Datenbankbezeichnungen sind in Klammern hinzugefügt.
Datensätze werden in der Tabelle in einer Zeile gespeichert. Die einzelnen Spalten werden durch
das Feld, den Typ und die Festlegung, ob das Feld leer sein darf, weitgehend beschrieben. Je
nach Typ kann noch der Umfang an Zeichen festgelegt werden. Außerdem kann ein Standardwert
eingegeben werden, der immer dann abgespeichert wird, wenn keine Eingabe erfolgt.
In der grafischen Benutzeroberfläche von Base sind die Begriffe einer Spalte etwas anders
umschrieben:

Bezeichnungen in der Base-GUI
Spalte (COLUMN)
Feldeigenschaften
Feldname(FIELD)

Feldtyp(TYPE)

Eingabe erforderlich(NULL/NOT NULL)

Defaultwert(DEFAULT)

Feld wird zu Feldname, Typ wird zu Feldtyp. Feldname und Feldtyp werden im oberen Bereich desTabelleneditors eingegeben. Im unteren Bereich gibt es dann die Möglichkeit, unter den
Feldeigenschaften die anderen Spalteneigenschaften festzulegen, sofern dies durch die GUI
festlegbar ist. Grenzen sind hier z.B., den Defaultwert eines Datumsfeldes mit dem bei der
Eingabe aktuellen Datum festzulegen. Dies geht nur über eine entsprechende SQL-Eingabe, siehedazu: Fehler: Referenz nicht gefunden.
Defaultwert: Der Begriff "Defaultwert" in der GUI entspricht nicht dem, wasDatenbanknutzer unter Defaultwert verstehen. Die GUI gibt hier einen bestimmten
Wert sichtbar vor, der dann mit abgespeichert wird.

HinweisDer Defaultwert einer Datenbank wird in der Tabellendefinition gespeichert. Er wird
dann in das Feld geschrieben, wenn es bei der neuen Erstellung eines Datensatzes
leer bleibt. SQL-Defaultwerte erscheinen auch nicht bei der Bearbeitung derEigenschaften einer Tabelle.

Erstellung mit der grafischen Benutzeroberfläche
Die Erstellung innerhalb der grafischen Benutzeroberfläche ist in "Erste Schritte – Einführung in
Base" ausführlich beschrieben. Hier deshalb nur die Hauptfehlerquellen:
Beim Abspeichern eines Tabellenentwurfs erscheint die Nachfrage, ob ein Primärschlüssel erstellt
werden soll. Dies deutet darauf hin, dass ein wesentliches Feld in der Tabelle fehlt. Ohne einen
Primärschlüssel kann die Datenbank auf die Tabelle nicht zugreifen. In der Regel wird dieses Feld
mit dem Kürzel "ID" bezeichnet, mit dem Zahlentyp INTEGER versehen und als "AutoWert"
mitlaufen gelassen. Mit einem Rechtsklick auf das entsprechende Feld kann es zum
Primärschlüsselfeld erklärt werden.

Erstellung von Tabellen

11Sollen von einer anderen Tabelle in dieser Tabelle Informationen mitgeführt werden (Beispiel:Adressdatenbank, aber ausgelagert Postleitzahlen und Orte), so ist ein Feld mit dem gleichen
Zahlentyp wie dem des Primärschlüssels der anderen Tabelle in die Tabelle aufzunehmen.
Angenommen die Tabelle "PLZ_Ort" hat als Primärschlüssel das Feld "ID", als Zahlentyp'Tiny Integer'. In der Tabelle Adressen erscheint jetzt ein Feld "ID_PLZ_Ort" mit dem Zahlentyp'Tiny Integer'. Es wird also in der Tabelle Adressen immer nur die Zahl eingetragen, die als
Primärschlüssel in der Tabelle "PLZ_Ort" steht. Für die Tabelle Adresse heißt das: Sie hat einen
Fremdschlüssel zusätzlich zum eigenen Primärschlüssel bekommen.
Grundlage bei der Namenswahl von Feldern in der Tabelle: Keine 2 Felder dürfen gleich heißen.
Deswegen darf auch nicht ein zweites Feld mit der Bezeichnung "ID" als Fremdschlüssel in derTabelle "Adressen" auftauchen.
Die Feldtypen können nur begrenzt geändert werden. Eine Aufstufung (längeres Textfeld, größerer
Zahlenumfang) ist ohne weiteres möglich, da alle eventuell schon eingegebenen Werte diesem
Feldtyp entsprechen. Eine Abstufung wirft eher Probleme auf. Hier droht gegebenenfalls
Datenverlust.

Einstellung eines Indexes
Manchmal erscheint es sinnvoll, neben dem Primärschlüssel auch andere Felder oder eine
Kombination anderer Felder mit einem Index zu versehen. Ein Index dient dazu, Suchergebnisse
schneller zu erhalten. Er kann außerdem dazu genutzt werden, Doppeleingaben zu vermeiden.
Jeder Index hat eine fest definierte Sortierreihenfolge. Wird eine Tabelle ohne Sortierung
aufgerufen, so richtet sich die Sortierreihenfolge immer nach der Sortierreihenfolge der als Index
definierten Felder.

Abbildung 7: Zugriff auf den
Indexentwurf
Der Zugriff auf den Indexentwurf erfolgt über Tabellen → Bearbeiten → Extras → Indexentwurf.

12

TabellenAbbildung 8: Erstellen eines neuen IndexesÜber "Neuer Index" wird ein Index neben dem des Primärschlüssels erstellt.

Abbildung 9: Der Index wird als "Eindeutig" definiert.
Dem neuen Index wird automatisch die Bezeichnung "index1" zugewiesen. Im Indexfeld wird
ausgewählt, welches Feld bzw. welche Felder über den Index verwaltet werden sollen. Dabei wird
gleichzeitig eine Sortierung eingestellt.
Ein Index kann prinzipiell auch über Tabellenfelder erstellt werden, die keine eindeutigen Werte
haben. Im obigen Bild ist aber das Index-Detail "Eindeutig" gewählt, so dass in das Feld
"Nachname" zusammen mit dem Feld "Vorname" nur Werte eingegeben werden können, die dort
in der Kombination noch nicht stehen. So ist z.B. Robert Müller und Robert Maier möglich, ebenso
Robert Müller und Eva Müller.

Erstellung von Tabellen

13Wird ein Index über ein Feld erstellt, so wird die Eindeutigkeit auf ein Feld bezogen. Ein solcher
Index ist in der Regel der Primärschlüssel. In diesem Feld darf jeder Wert nur einmal vorkommen.
Beim Primärschlüssel darf allerdings zusätzlich das Feld auf keinen Fall NULL sein.
Eine Sonderstellung für einen eindeutigen Index nimmt in einem Feld das Fehlen eines Eintrages,
also NULL, ein. Da NULL alle beliebigen Werte annehmen könnte ist es ohne weiteres erlaubt, bei
einem Index über zwei Felder in einem Feld mehrmals hintereinander die gleiche Eingabe zu
tätigen, solange in dem anderen Feld keine weitere Angabe gemacht wird.

Hinweis

NULL ist für Datenbanken die Bezeichnung für eine leere Zelle, die nichts enthält.
Mit einem Feld, das NULL ist kann also nicht gerechnet werden. Im Gegensatz dazu
gehen Tabellenkalkulationen bei leeren Feldern automatisch davon aus, dass derInhalt "0" ist.

Beispiel: In einer Mediendatenbank wird für die Ausleihe die Mediennummer und das Ausleihdatum
eingegeben. Wird das Medium zurückgegeben, so wird dies durch ein Rückgabedatum vermerkt.
Nun könnte ein Index über die Felder "Mediennummer" und "Rückgabedatum" doch leicht
verhindern, dass das gleiche Medium mehrmals ausgeliehen wird, ohne dass die Rückgabevermerkt wurde. Dies funktioniert aber leider nicht, da das Rückgabedatum ja noch nicht mit einem
Wert versehen ist. Der Index verhindert stattdessen, dass ein Medium zweimal mit dem gleichen
Datum zurückgegeben wird – sonst nichts.

Mängel der grafischen Tabellenerstellung
Die Reihenfolge der Tabellenfelder kann im Anschluss an den Abspeichervorgang nicht mehr
geändert werden. Für eine Darstellung in anderer Reihenfolge ist dann eine Abfrage notwendig.
Nur über direkte SQL-Eingabe kann ein neues Feld an eine bestimmte Position innerhalb derTabelle rutschen. Bereits erstellte Felder sind aber auch hier nicht beweglich.
Eigenschaften der Tabellen müssen sofort festgelegt werden. Welche Felder sollen nicht NULL
sein, welche einen Standardwert (Default) erhalten. Diese Eigenschaft kann hinterher innerhalb
der grafischen Benutzeroberfläche nicht geändert werden.
Die dort abgelegten Default-Werte haben nichts mit den in der Datenbank selbst liegenden
Default-Werten zu tun. So kann dort z.B. bei einem Datum nicht als Standard das aktuelle Datum
vorgegeben werden. Dies ist der direkten Eingabe über SQL vorbehalten.

Direkte Eingabe von SQL-Befehlen
Die direkte Eingabe von SQL-Befehlen ist über das Menü Extras → SQL erreichbar.

14

TabellenHier werden Befehle im oberen Fensterbereich eingegeben; im unteren Bereich wird der Erfolg
oder gegebenenfalls die Gründe für den fehlenden Erfolg (auf Englisch) mitgeteilt. Abfragenkönnen hier nicht dargestellt werden. Für sie ist bei den Abfragen extra die Möglichkeit gegeben,
die Abfrage im SQL-Modus zu bearbeiten.

Abbildung 10: Fenster für direkte Eingabe von SQL-Befehlen
Eine Übersicht der für die eingebaute HSQLDB möglichen Eingaben war bisher unter
http://hsqldb.org/doc/guide/ch09.html zu finden. Die dortigen Inhalte werden in den folgenden
Abschnitten erklärt. Einige Befehle machen nur Sinn, wenn es sich dabei um eine externe
HSQLDB handelt (Benutzerangaben usw.) Sie werden gegebenenfalls im Abschnitt "Arbeit mit derexternen HSQLDB" aufgeführt.

HinweisLibreOffice liegt die Version 1.8.0 der HSQLDB zugrunde. Die aktuell erhältliche
Serverversion hat die Version 2.2. Die Funktionen der neuen Version sindumfangreicher. Die Beschreibung der alten Version wurde während der Erstellung
dieses Handbuches vom Netz genommen. Die Beschreibung ist weiterhin in den
Installationspaketen zur HSQLDB enthalten, die von
http://sourceforge.net/projects/hsqldb/files/hsqldb/ heruntergeladen werden können.

Tabellenerstellung
Ein einfacher Befehl um eine gebrauchstüchtige Tabelle zu erstellen, ist z. B.
CREATE TABLE "Test" ("ID" INT PRIMARY KEY, "Text" VARCHAR(50));
CREATE TABLE "Test": Erschaffe eine Tabelle mit dem Namen "Test".
( ): mit den hierin enthaltenen Feldnamen, Feldtypen und Zusätzen.
Erstellung von Tabellen

15

"ID" INT PRIMARY KEY, "Text" VARCHAR(50): Feldname "ID" mit dem Zahlentyp Integer
als Primärschlüssel, Feldname "Text" mit dem Texttyp variable Textlänge und der Textbegrenzungauf 50 Zeichen.
CREATE [MEMORY | CACHED | [GLOBAL] TEMPORARY | TEMP | TEXT] TABLE"Tabellenname" ( <Felddefinition> [, ...] [,<Bedingungsdefinition>...] ) [ON COMMIT {DELETE | PRESERVE} ROWS];[MEMORY | CACHED | [GLOBAL] TEMPORARY | TEMP | TEXT]:Die Standardeinstellung ist hier MEMORY. Die HSQLDB erstellt also grundsätzliche alle Tabellen
im Arbeitsspeicher. Dies gilt auch für die Tabellen, die über LibreOffice Base in der internen
Datenbank geschrieben werden. Eine andere Möglichkeit wäre, die Tabellen auf die Festplattezu schreiben und nur über den Arbeitsspeicher den Zugriff auf die Festplatte puffern zu lassen(CACHED). Tabellen im Format TEXT sind in der rein auf MEMORY ausgelegten internen
Datenbank nicht beschreibbar, auf TEMPORARY bzw. TEMP kann Base nicht zugreifen. Die
SQL-Befehle werden hier wohl abgesetzt, die Tabellen aber nicht in der grafischen
Benutzeroberfläche angezeigt (und damit auch nicht über die grafische Benutzeroberfläche
löschbar) und die Eingaben (über SQL) auch nicht über die grafische Benutzeroberfläche desAbfragemoduls anzeigbar, es sei denn die automatische Löschung des Inhaltes nach dem
endgültigen Abspeichern ist ausgeschaltet. Eine Abfrage ergibt hier eine Tabelle ohne Inhalt.
Tabellen, die mit SQL direkt gegründet wurden, werden nicht direkt angezeigt. Hier muss
entweder über Ansicht → Tabellen aktualisieren eine Auffrischung erfolgen oder die
Datenbank einfach geschlossen und erneut geöffnet werden.
<Felddefinition>:"Feldname" Datentyp [(Zeichenanzahl[,Nachkommastellen])] [{DEFAULT"Standardwert" | GENERATED BY DEFAULT AS IDENTITY (START WITH <n>[,
INCREMENT BY <m>])}] | [[NOT] NULL] [IDENTITY] [PRIMARY KEY]
Erlaubte Standardwerte innerhalb der Felddefinition:
Für Textfelder kann ein Text in einfachen Anführungsstrichen oder NULL eingegeben werden.
Die einzige SQL-Funktion, die erlaubt ist, ist CURRENT_USER. Dies ergibt allerdings nur danneinen Sinn, wenn die HSQLDB als externe Serverdatenbank mit mehreren Nutzern betrieben
wird.
Für Datums- und Zeitfelder kann ein Datum, eine Zeit oder eine Kombination aus Datum und
Zeit in einfachen Anführungsstrichen oder NULL eingegeben werden. Dabei ist zu beachten,
dass das Datum amerikanischen Konventionen entspricht (yyyy-mm-dd), die Zeitangabe dasFormat hh:mm:ss hat und der Datums_Zeit_Wert das Format yyyy-mm-dd hh:mm:ss.
SQL-Funktionen, die erlaubt sind:für das aktuelle Datum
für die aktuelle Zeit
für den aktuellen Datums-Zeit-Wert -CURRENT_DATE, TODAYCURRENT_TIME, NOW
CURRENT_TIMESTAMP, NOW.

Für boolsche Felder (Ja/Nein) können die Ausdrücke FALSE, TRUE, NULL gesetzt werden.
Diese sind ohne einfache Anführungszeichen einzugeben.
Für numerische Felder ist jede in dem Bereich gültige Zahl sowie NULL möglich. Auch hiersind, zumindest bei NULL, keine einfachen Anführungszeichen einzugeben. Bei der Eingabe
von Nachkommazahlen ist darauf zu achten, dass die Dezimalstellen durch einen Punkt undnicht durch ein Komma getrennt werden.
Für Binärfelder (Bilder etc.) ist jeder gültige Hexadezimalstring in einfachen Anführungsstrichen
sowie NULL möglich. Beispiel für einen Hexadezimalstring: '0004ff' bedeutet 3 Bytes, zuerst 0,
als zweites 4 und zum Schluss 255 (0xff). Da Binärfelder in der Praxis nur für Bilder eingesetzt
werden müsste also der Binärcode des Bildes bekannt sein, das den Defaultwert bilden soll.
16

Tabellen

NOT NULL → der Feldwert kann nicht NULL sein. Diese Bedingung kann lediglich in derFelddefinition mit angegeben werden.

HinweisHexadezimalsystem: Zahlen werden in einem Stellenwertsystem von 16 dargestellt.
Die Ziffern 0 bis 9 und die Buchstaben a bis f ergeben pro Spalte 16 Ziffern imMischsystem. Bei zwei Feldern kommen dann 16*16=256 mögliche Werte dabei
zustande. Das entspricht schließlich 1 Byte (28).

<Bedingungsdefinition>:[CONSTRAINT "Name"]
UNIQUE ( "Feldname 1" [,"Feldname 2"...] ) |PRIMARY KEY ( "Feldname 1" [,"Feldname 2"...] ) |FOREIGN KEY ( "Feldname 1" [,"Feldname 2"...] )REFERENCES "anderer Tabellenname" ( "Feldname_1" [,"Feldname 2"...])[ON {DELETE | UPDATE}{CASCADE | SET DEFAULT | SET NULL}] |CHECK(<Suchbedingung>)
Bedingungsdefinitionen (Constraints) definieren Bedingungen, die beim Einfügen der Daten
erfüllt sein müssen. Die Constraints können mit einem Namen versehen werden.
UNIQUE ("Feldname") → der Feldwert muss innerhalb des Feldes einzigartig sein
PRIMARY KEY ("Feldname") → der Feldwert muss einzigartig sein und kann nicht NULL
sein (Primärschlüssel)
FOREIGN KEY ("Feldname") REFERENCES <"anderer Tabellenname">("Feldname") → Die aufgeführten Felder dieser Tabelle sind mit den Feldern einer anderen
Tabelle sind verknüpft. Der Feldwert muss auf "Referentielle Integrität" geprüft werden(Fremdschlüssel), d.h. Es muss ein entsprechender Primärschlüssel in der anderen Tabelle
existieren, wenn hier ein Wert eingetragen wird.
[ON {DELETE | UPDATE} {CASCADE | SET DEFAULT | SET NULL}] → Wenn ein
Fremdschlüssel besteht, so ist hier zu klären, wie damit verfahren werden soll, wenn z.B. derfremde Datensatz gelöscht wird. Z.B. macht es keinen Sinn, in einer Ausleihtabelle einer
Bibliothek eine Nutzernummer weiter zu führen, wenn der Nutzer selbst gar nicht mehr
existiert. Die entsprechenden Datensätze müssten behandelt werden, so dass die Beziehungzwischen den Tabellen stimmig bleibt. In der Regel würde der entsprechende Datensatz
einfach gelöscht. Dies geschieht mit ON DELETE CASCADE.
CHECK(<Suchbedingung>) → Wird wie eine WHERE-Bedingung formuliert, bezieht sich aber
nur auf den aktuellen Datensatz.
Mit Constrains wird vor allem gearbeitet, wenn die Beziehung zwischen Tabellen oder derIndex für bestimmte Felder festgelegt werden soll.
[ON COMMIT {DELETE | PRESERVE} ROWS]:
Der Inhalt von Tabellen des Typs TEMPORARY oder TEMP wird nach Beendigung der Arbeit mit
dem Datensatz standardmäßig gelöscht (ON COMMIT DELETE ROWS). Hier kann also nur ein
flüchtiger Datensatz erstellt werden, der Informationen für andere Aktionen, die gleichzeitig
laufen, vorhält.
Sollen diese Tabellentypen Daten für eine ganze Sitzung (Aufruf einer Datenbank und
Schließen einer Datenbank) zur Verfügung stehen, so kann hier ON COMMIT PRESERVEROWS gewählt werden.

Tabellenänderung
Manchmal wünscht sich der User, dass ein zusätzliches Feld an einer bestimmten Stelle in die
Tabelle eingebaut wird. Angenommen es gibt die Tabelle "Adresse" mit den Feldern "ID", "Name",

Erstellung von Tabellen

17"Strasse" usw. Jetzt fällt dem Nutzer auf, dass vielleicht eine Unterscheidung in Name undVorname sinnvoll wäre:
ALTER TABLE "Adresse" ADD "Vorname" VARCHAR(25) BEFORE "Name";
ALTER TABLE "Adresse": Ändere die Tabelle mit dem Namen "Adresse".
ADD "Vorname" VARCHAR(25): füge das Feld "Vorname" mit einer Länge von 25 Zeichen
hinzu.
BEFORE "Name": und zwar vor dem Feld "Name".
Die Möglichkeit, die Position nach dem Erstellen einer Tabelle für zusätzliche Felder zu
bestimmen, bietet die GUI nicht.
ALTER TABLE "Tabellenname" ADD [COLUMN] <Felddefinition> [BEFORE"bereits_existierender_Feldname"];Die zusätzliche Bezeichnung COLUMN ist dabei nicht erforderlich, da keine Alternativen zur
Auswahl stehen.
ALTER TABLE "Tabellenname" DROP [COLUMN] "Feldname";
Das Feld "Feldname" wird aus der Tabelle "Tabellenname" gelöscht. Dies wird allerdings
unterbunden, wenn das Feld in einem View oder als Fremdschlüssel in einer anderen Tabelle
Bedeutung hat.
ALTER TABLE "Tabellenname" ALTER COLUMN "Feldname" RENAME TO"neuer_Feldname"Ändert den Namen eines Feldes
ALTER TABLE "Tabellenname" ALTER COLUMN "Feldname" SET DEFAULT<Standardwert>};Fügt dem Feld einen bestimmten Standardwert hinzu. NULL entfernt einen bestehenden
Standardwert.
ALTER TABLE "Tabellenname" ALTER COLUMN "Feldname" SET [NOT] NULL
Setzt oder entfernt eine NOT NULL Bedingung für ein Feld.
ALTER TABLE "Tabellenname" ALTER COLUMN <Felddefinition>;
Die Felddefinition entspricht der aus der Fehler: Referenz nicht gefunden mit den folgenden
Einschränkungen:•

Das Feld muss bereits ein Primärschlüsselfeld sein um die Eigenschaft IDENTITY zu
akzeptieren. IDENTITY bedeutet, dass das Feld die Eigenschaft "Autowert" erhält. Dies ist
nur bei INTEGER oder BIGINT möglich. Zu den Feldtypenbezeichnungen siehe den
Anhang dieses Handbuches.

•

Wenn das Feld bereits die Eigenschaft IDENTITY hat und sie wird nicht in die
Felddefinition erneut aufgenommen, so wird die bereits existierende Eigenschaft
IDENTITY entfernt.

•

Der Standardwert wird der der neuen Felddefinition sein. Wenn die Definition desStandardwertes leer gelassen wird, so wird ein bereits bestehender entfernt.

•

Die Eigenschaft NOT NULL wird in die neue Definition übernommen, wenn nicht anders
definiert. Dies entspricht dem Umgang mit dem Standardwert.

•

Abhängig von der Art der Änderung muss eventuell die Tabelle leer sein, damit dieÄnderung durchgeführt werden kann. Auf jeden Fall wird die Änderung dann funktionieren,wenn die Änderung grundsätzlich möglich ist (z.B. Änderung von NOT NULL auf NULL) und
die existierenden Werte alle umgewandelt werden können (z.B. von TINYINT zu
INTEGER).

ALTER TABLE "Tabellenname"18

TabellenALTER COLUMN "Feldname" RESTART WITH <neuer_Feldwert>
Dieser Befehl wird ausschließlich für ein IDENTITY Feld genutzt. Damit wird der nächste Wert
eines Feldes mit Autowert-Funktion festgelegt. Dies kann z.B. genutzt werden, wenn eine
Datenbank erst einmal mit Testdaten versehen wurde, bevor sie mit den eigentlichen Daten
bestückt wurde. Dann wird der Inhalt der Tabellen gelöscht und der neue Feldwert z.B. als 1
festgelegt.
ALTER TABLE "Tabellenname"
ADD [CONSTRAINT "Bedingungsname"] CHECK (<Suchbedingung>);
Dies fügt eine mit CHECK eingeleitete Suchbedingung hinzu. Solch eine Bedingung wird nicht auf
bereits bestehende Datensätze angewandt, sondern bei allen zukünftigen Änderungen und neu
erstellten Datensätzen berücksichtigt. Wird kein Bedingungsname definiert, so wird automatischeine Bezeichnung zugewiesen. Beispiel:
ALTER TABLE "Ausleihe" ADD CHECK(IFNULL("Rueckdatum","Leihdatum")>="Leihdatum")
Die Tabelle "Ausleihe" soll in Bezug auf Fehleingaben abgesichert werden. Es soll vermieden
werden, dass ein Rückgabedatum angegeben wird, das vor dem Ausleihdatum liegt. Taucht jetzt
bei der Eingabe des Rückgabedatums dieser Fehler auf, so erscheint die Fehlermeldung Checkconstraint violation …
ALTER TABLE "Tabellenname"
ADD [CONSTRAINT "Bedingungsname"] UNIQUE ("Feldname1","Feldname2" ...);
Hier wird hinzugefügt, dass die benannten Felder nur jeweils verschiedene Werte beinhalten
dürfen. Werden mehrere Felder benannt, so gilt dies für die Kombination von Feldern. NULL wird
hierbei nicht berücksichtigt. Ein Feld kann also ohne weiteres mehrmals die gleichen Werte haben,
wenn das andere Feld bei den entsprechenden Datensätzen NULL ist.
Der Befehl wird nicht funktionieren, wenn bereits eine UNIQUE – Bedingung für die gleiche
Felderkombination existiert.
ALTER TABLE "Tabellenname"
ADD [CONSTRAINT "Bedingungsname"] PRIMARY KEY ("Feldname1","Feldname2" ...);
Fügt einen Primärschlüssel, gegebenenfalls mit einer Bedingungsdefinition, einer Tabelle hinzu.
Die Syntax der Bedingungsdefinition entsprecht der der Erstellung bei einer Tabelle.
ALTER TABLE "Tabellenname"
ADD [CONSTRAINT "Bedingungsname"] FOREIGN KEY ("Feldname1","Feldname2" ...)REFERENCES "Tabellenname_der_anderen_Tabelle"("Feldname1_andere_Tabelle", "Feldname2_andere_Tabelle" ...)
[ON {DELETE | UPDATE} {CASCADE | SET DEFAULT | SET NULL}];
Hiermit wird eine Fremdschlüsselbedingung (FOREIGN KEY) zur Tabelle hinzugefügt. Die Syntax
ist die gleiche wie bei der Erstellung einer Tabelle.
Das Verfahren wird mit einer Fehlermeldung beendet, wenn nicht für jeden Wert in der Tabelle ein
entsprechender Wert aus der Tabelle mit dem entsprechenden Schlüsselfeld vorhanden ist.
Beispiel: Die Tabellen "Name" und "Adresse" sollen miteinander verbunden werden. In der Tabelle"Name" gibt es ein Feld mit der Bezeichnung "Adresse_ID". Dies soll mit seinen Werte mit dem
Feld "ID" der Tabelle "Adresse" verbunden werden. Steht in "Adresse_ID" bereits der Wert 1, in
dem "ID" der Tabelle "Adresse" aber nicht, so kann die Verbindung nicht funktionieren. Ebenfalls
unmöglich ist es, wenn der Feldtyp in beiden Feldern nicht übereinstimmt.
ALTER TABLE "Tabellenname" DROP CONSTRAINT "Bedingungsname";

Erstellung von Tabellen

19Der Befehl entfernt eine mit Namen versehene Bedingung (UNIQUE, CHECK, FOREIGN KEY) aus
einer Tabelle.
ALTER TABLE "Tabellenname" RENAME TO "neuer_Tabellenname";
Mit diesem Befehl schließlich wird einfach nur der Name einer Tabelle geändert.

Tabellen löschen
DROP TABLE "Tabellenname" [IF EXISTS] [RESTRICT | CASCADE];
Löscht die Tabelle "Tabellenname".
IF EXISTS schließt aus, dass eine Fehlermeldung erscheint, falls diese Tabelle nicht existiert.
RESTRICT ist die Standardeinstellung und muss nicht definitiv gewählt werden, d.h. ein Löschen
wird dann nicht ausgeführt, wenn die Tabelle mit irgendeiner anderen Tabelle durch einen
Fremdschlüssel verbunden wurde oder auf die Tabelle mit einem View (Ansicht) Bezug genommen
wird. Abfragen sind davon nicht berührt, da die innerhalb der HSQLDB nicht gespeichert sind.
Wird statt RESTRICT CASCADE gewählt, so werden alle Beziehungen zu der Tabelle"Tabellenname" gelöscht. In den verknüpften Tabellen werden dann alle Fremdschlüsselfelder auf
NULL gesetzt. Alle Views, in denen auf die entsprechende Tabelle Bezug genommen wird, werden
komplett gelöscht.

Verknüpfung von Tabellen
Prinzipiell kommt eine Datenbank auch ohne die Verknüpfung von Tabellen aus. Der Nutzer mussdann bei der Eingabe selbst darauf achten, dass die Beziehungen zwischen den Tabellen stimmig
bleiben. In der Regel geschieht dies, indem er sich entsprechende Formulare erstellt, die dies
bewerkstelligen sollen.
Das Löschen von Datensätzen bei verknüpften Tabellen ist nicht so einfach möglich. Angenommen
es würde aus der Tabelle Strasse in Abbildung 6 eine Strasse gelöscht, die aber durch die
Verknüpfung mit der Tabelle Adresse in der Tabelle Adresse noch als Fremdschlüssel vertreten ist.
Der Verweis in der Tabelle Adresse würde ins Leere gehen. Hiergegen sperrt sich die Datenbank,sobald der Relationenentwurf erstellt wurde. Um die Strasse löschen zu können, muss die
Vorbedingung erfüllt sein, dass sie nicht mehr in Adresse benötigt wird.
Die grundsätzlichen Verknüpfungen werden über Extras → Beziehungen festgelegt. Hierbei wird
eine Verbindungslinie von dem Primärschlüssel einer Tabelle zum zu definierenden
Sekundärschlüssel gezogen.
Die folgenden Fehlermeldungen können beim Ziehen so einer Verbindung auftreten:

20

Tabellen

Die Meldung gibt einen englischen Text sowie das zu der Fehlermeldung führende SQLKommando wieder. Eine gute Möglichkeit also, auch an dieser Stelle etwas über die Sprache zu
erfahren, mit der die Datenbank arbeitet.
"Column types do not match in statement" - die Spaltentypen stimmen in der SQL-Formulierung
nicht überein. Da das SQL-Kommando gleich mitgeliefert wird, müssen das die Spalten
Adresse.str_ID und Strasse.ID sein. Zu Testzwecken wurde hier das eine Feld als Integer, dasandere als 'Tiny Integer' definiert. So eine Verbindung lässt sich nicht erstellen, da das eine Feld
nicht die gleichen Werte annehmen kann wie das andere Feld.

Jetzt stimmen die Spaltentypen überein. Die SQL-Formulierung (statement) ist die gleiche wie
beim ersten Zugriff. Aber wieder taucht ein Fehler auf:
"Integrity constraint violation – no parent 1, table: Adresse ..." - die Integrität der Beziehung ist nicht
gewährleistet. In dem Feld der Tabelle Adresse, also Adresse.str_ID, gibt es eine Ziffer 1, die es im
Feld Strasse.ID nicht gibt. Parent ist hier die Tabelle Strasse, weil deren Primärschlüssel
vorhanden sein muss. Dieser Fehler tritt häufig auf, wenn zwei Tabellen miteinander verbunden
werden sollen, bei denen in den Feldern der Tabelle mit dem zukünftigen Fremdschlüssel schon
Daten eingegeben wurden. Steht in dem Fremdschlüssel-Feld ein Eintrag, der in der ParentTabelle (Eltern-Tabelle, also der Tabelle, au der der Primärschlüssel gestellt wird) nicht vorhanden
ist, so würde ein ungültiger Eintrag erzeugt.

Ist die Verbindung erfolgreich erzeugt worden und wird später versucht einen entsprechend
fehlerhaften Eintrag in die Tabelle einzugeben, so kommt die folgende Fehlermeldung:

Verknüpfung von Tabellen21

Also wiederum die Integritätsverletzung. Base weigert sich, für das Feld str_ID nach der
Verknüpfung den Wert 1 anzunehmen, weil die Tabelle Strasse so einen Wert im Feld ID nicht
enthält.

Abbildung 11: Durch Klick mit der rechten
Maustaste können Verknüpfungenbearbeitet werden.
Die Eigenschaften der Verknüpfung können so bearbeitet werden, dass beim Löschen vonDatensätzen aus der Tabelle Strasse gleichzeitig eventuell vorhandene Einträge in der Tabelle
Adresse auf NULL gesetzt werden.

22

Tabellen

Die oben abgebildeten Eigenschaften beziehen sich immer auf eine Aktion, die mit einer Änderung
des Datensatzes aus der Tabelle zusammenhängt, zu der der betroffene Primärschlüssel gehört.
In unserem Fall ist dies die Tabelle Strasse. Wird also dort ein Datensatz geändert (Update), z.B.
eine falsch geschriebene Strasse korrigiert, so können die folgenden Aktionen ausgeführt werden:
Keine Aktion:
Es wird nichts unternommen. Die Änderung des Straßennamens wirkt sich also auf alle
Datensätze aus, in denen die ID als Fremdschlüssel (Adresse.Strasse_ID) steht.
Eine Änderung des Primärschlüssels Strasse.ID kann nicht vorgenommen werden, da die
Relation ansonsten zerstört wird.
Kask. Update:
Bei einer Änderung des Straßennamens passiert wieder nichts. Bei einer Änderung desPrimärschlüsselwertes Strasse.ID allerdings wird der Fremdschlüsselwert automatisch auf den
neuen Stand gebracht. Die Koppelung wird dadurch nicht beeinträchtigt. Wird z.B. der Wert
von 3 auf 4 geändert, so wird bei allen Datensätzen aus Adresse, in denen der Fremdschlüssel
Adresse.Strasse_ID 3 lautete, stattdessen eine 4 eingetragen.
Null setzen:
Auch hier macht sich nur eine Änderung am Primärschlüssel Strasse.ID bemerkbar. Alle
Datensätze, die sich auf den Primärschlüssel bezogen haben, haben jetzt in dem
Fremdschlüsselfeld Adresse.Strasse_ID stattdessen keinen Eintrag mehr stehen, sind also
NULL.
Default setzen:
Wird der Primärschlüssel Strasse.ID geändert, so wird der damit ursprünglich verbundene Wert
aus Adresse.Strasse_ID auf den dafür vorgesehenen Standardwert gesetzt. Hierfür ist
allerdings eine eindeutige Definition eines Standardwertes erforderlich. Dies scheint die
grafische Benutzeroberfläche bis zur Version LO 3.5 nicht bereitzustellen. Wird per SQL derDefault-Wert durch
Verknüpfung von Tabellen

23

ALTER TABLE "Adresse" ALTER COLUMN "Strasse_ID" SET DEFAULT 1;
gesetzt, so übernimmt die Beziehungsdefinition auch die Zuweisung, dass bei einem Update
auf diesen Wert zurückgegriffen werden kann. Wird also der Primärschlüssel aus der Tabelle
Strasse geändert, so wird in der Tabelle Adresse das Fremdschlüsselfeld auf 1 gesetzt. Diesbietet sich z.B. an, wenn auf jeden Fall jeder Datensatz eine Straßenzuweisung erhalten soll,
also nicht NULL sein soll. Aber Achtung: Ist 1 nicht belegt, so wird eine Verbindung zu einem
nicht vorhandenen Wert erzeugt. Hier scheint die HSQLDB nicht mit letzter Konsequenz
durchdacht. Es ist also möglich, die Integrität der Relationen zu zerstören.

Vorsicht

Achtung: Ist der Defaultwert im Fremdschlüsselfeld nicht durch einen
Primärschlüssel der Ursprungstabelle belegt, so wird eine Verbindung zu einem
nicht vorhandenen Wert erzeugt. Es ist also möglich, die referentielle Integrität derDatenbank zu zerstören.

Vor diesem Hintergrund scheint es sinnvoll, diese Einstellung nicht in Betracht zu ziehen.
Wird ein Datensatz aus der Tabelle Strasse gelöscht, so stehen die folgenden Optionen zur
Verfügung:
Keine Aktion:
Es wird nichts unternommen. Ist ein Datensatz aus der Tabelle Adresse von der Löschungbetroffen, so wird die Löschung abgelehnt.
Kaskadiert Löschen:
Wird ein Datensatz aus der Tabelle Strasse gelöscht und ist davon ein Datensatz aus derTabelle Adresse betroffen, so wird auch dieser gelöscht.
Das mag in diesem Zusammenhang merkwürdig klingen, ergibt aber bei anderen
Tabellenkonstruktionen sehr wohl einen Sinn. Angenommen es existiert eine Tabelle mit CDs
und eine Tabelle, die die Titel, die auf diesen CDs enthalten sind, speichert. Wird nun ein
Datensatz aus der CD-Tabelle gelöscht, so stehen lauter Titel in der anderen Tabelle, die gar
keinen Bezug mehr haben, also gar nicht mehr vorhanden sind. Hier ist dann ein
kaskadierendes Löschen sinnvoll. So muss der Nutzer nicht vor dem Entfernen der CD aus derDatenbank erst sämtliche Titel löschen.
Null setzen:
Dieses Verhalten entspricht der gleichlautenden Update-Option.
Default setzen:
Dieses Verhalten entspricht ebenfalls der gleichlautenden Update-Option. Die Bedenken bei
dieser Option sind entsprechend die gleichen.

Tipp

Sollen möglichst Fehlermeldungen der Datenbank vermieden werden, da sie dem
Datenbanknutzer vielleicht nicht deutbar sind, so sind auf jeden Fall die Einstellungen"Keine Aktion" zu vermeiden.

Eingabe von Daten in Tabellen
Datenbanken, bestehend aus einer Tabelle, erfordern in der Regel keine Formulare zur Eingabe,
es sei denn sie enthalten ein Feld für Bildmaterial. Sobald allerdings eine Tabelle den
Fremdschlüssel einer anderen Tabelle enthält, muss der Nutzer entweder auswendig wissen,welche Schlüsselnummern er eintragen muss, oder er muss die andere Tabelle zum Nachschauen
gleichzeitig offen halten. Dafür wird dann spätestens ein Formular sinnvoll.

24

TabellenEingabe über die grafische Benutzeroberfläche der Tabelle
Die Tabelle aus dem Tabellencontainer wird durch einen Doppelklick geöffnet. Wird derPrimärschlüssel durch ein automatisch hochzählendes Feld erstellt, so enthält eins der jetzt zu
sehenden Felder bereits den Text "AutoWert". Im "AutoWert"-Feld ist keine Eingabe möglich.
Dieser Wert kann gegebenenfalls erst nach Abspeicherung des Datensatzes geändert werden.

Abbildung 12: Eingabe in Tabellen Spalten ausblenden.

Abbildung 13: Eingabe in Tabellen - Spalten
wieder einblenden.

Einzelne Spalten der Tabellenansicht können auch ausgeblendet werden. Wenn z.B. dasPrimärschlüsselfeld nicht unbedingt sichtbar sein soll, so lässt sich das in der Tabelleneingabe
einstellen. Diese Einstellung wird als Einstellung der GUI abgespeichert. Die Spalte existiert in derTabelle weiter und kann gegebenenfalls auch wieder eingeblendet werden.
Die Eingabe in die Tabellenzellen erfolgt in der Regel von links nach rechts über Tastatur und
Tabulator. Natürlich ist auch die Nutzung der Maus möglich.
Nach Erreichen des letzten Feldes eines Datensatzes springt der Cursor automatisch in den
nächsten Datensatz. Die vorhergehende Eingabe wurde dabei abgespeichert. Eine zusätzliche
Abspeicherung unter Datei → Speichern ist nicht nötig und nicht möglich. Die Daten sind bereits
in der Datenbank gelandet, bei der HSQLDB also im Arbeitsspeicher. Sie werden (aus Sicht derDatensicherheit leider) erst auf der Festplatte abgespeichert, wenn Base geschlossen wird. Wenn
Base also aus irgendwelchen Gründen nicht ordnungsgemäß beendet werden kann, kann dies
immer noch zu Datenverlusten führen.
Fehlt eine Eingabe, die vorher im Tabellenentwurf als zwingend notwendig deklariert wurde (NOT
NULL), so wird eine entsprechende Fehlermeldung erzeugt:
Attempt to insert null into a non-nullable column …
Die entsprechende Spalte, die Tabelle dazu und der von der GUI abgesetzte SQL-Befehl werdenangezeigt.
Die Änderung eines Datensatzes ist entsprechend einfach möglich: Feld aufsuchen, geänderten
Wert eingeben und Datenzeile wieder verlassen.

Eingabe von Daten in Tabellen

25Zum Löschen eines Datensatzes wird der Datensatz auf dem Zeilenkopf markiert, dann die rechte
Maustaste gedrückt und Zeilen löschen gewählt.
Hilfreich zum Aufsuchen des entsprechenden Datensatzes sind hier die Sortier-, Such- undFilterfunktionen.

Sortieren von Tabellen

Abbildung 14: Schnelle Sortierung
Die schnelle Sortiervariante verbirgt sich hinter den Buttons A→Z bzw. Z→A. Ein Feld innerhalb
einer Spalte wird aufgesucht, ein Mausklick auf den Button und nach der Spalte wird sortiert. Hier
wurde gerade die Spalte "Autor" absteigend sortiert.
Mit der schnellen Variante kann immer nur nach einer Spalte sortiert werden. Für eine Sortierungnach mehreren Spalten ist eine weitere Sortierfunktion vorgesehen:

26

TabellenAbbildung 15: Sortierung nach mehreren Spalten
Der Feldname der Spalte sowie die jeweilige Sortierreihenfolge werden ausgesucht. Wurde vorher
bereits eine schnelle Sortierung vorgenommen, so ist in der ersten Zeile der entsprechende
Feldname und die Sortierreihenfolge bereits eingetragen.

Suchen in Tabellen

Die Funktion zum Suchen von Datensätzen ist recht umfangreich und für durch Suchmaschinenverwöhnte Nutzer nicht gerade die erste Wahl, um einen bestimmten Datensatz zu finden.

Tipp

Bevor die Suche aufgerufen wird sollte auf jeden Fall darauf geachtet werden, dass diezu durchsuchenden Spalten von der Breite her weit genug eingestellt sind, um den
gefundenen Datensatz auch anzuzeigen. Die Suchfunktion bleibt nämlich im
Vordergrund und lässt keine Korrektur der Einstellungen der Spaltenweite in der
darunterliegenden Tabelle zu. Um an die Tabelle zu gelangen muss die Suche also
abgebrochen werden.

Eingabe von Daten in Tabellen

27

Abbildung 16: Eingabemaske zur Datensatzsuche
Die Suche übernimmt beim Aufruf den Begriff des Feldes, von dem aus sie aufgerufen wurde.
Damit die Suche effektiv verläuft, sollte der Suchbereich möglichst weit eingegrenzt sein. So dürfte
es sinnlos sein, den obigen Text aus dem Feld "Titel" in dem Feld "Autor" zu suchen. Stattdessen
wird bereits als einzelnes Feld der Feldname "Titel" vorgeschlagen.
Die weiteren Einstellungen der Datensatzsuche können die Suche nach bestimmten
Kombinationen vereinfachen. Als Platzhalter-Ausdruck sind hier die in SQL üblichen
Platzhalterbezeichnungen ("_" für ein variables Zeichen, "%" für eine beliebige Anzahl variabler
Zeichen und "\" als Escape-Zeichen, um auch nach den variablen Zeichen selbst suchen zu
können).
Reguläre Ausdrücke werden in der Hilfe von LibreOffice unter diesem Begriff ausführlichaufgeführt. Ansonsten gibt sich die Hilfestellung zu diesem Modul recht sparsam. Ein Klick auf den
Button Hilfe landet bei LO 3.3.4 und LO 3.5.2 auf einer leeren Seite.

28

TabellenAbbildung 17: Eingrenzung der Ähnlichkeitssuche
Die Ähnlichkeitssuche lässt sich vor allem dann nutzen, wenn es darum geht, Schreibfehler
auszuschließen. Je höher die Werte in den Einstellungen gesetzt werden, desto mehr Datensätze
werden schließlich in der Trefferliste verzeichnet sein.
Insgesamt ist dieses Suchmodul eher etwas für Leute, die durch häufige Anwendung genau
wissen, an welchen Stellen sie zum Erreichen eines Ziels drehen müssen. Für den Normaluser
dürfte die Möglichkeit, Datensätze durch Filter zu finden, schneller zum Ziel führen.
Für Formulare ist in einem der folgenden Kapitel beschrieben, wie mittels SQL, und erweitert mit
Makros, eine Stichwortsuche schneller zum Ziel führt.

Filtern von Tabellen

Die schnelle Filterung läuft über den AutoFilter. Der Cursor wird in ein Feld gesetzt, der Filterübernimmt nach einem Klick auf den Button diesen Feldinhalt. Es werden nur noch die Datensätze
angezeigt, die dem Inhalt des gewählten Feldes entsprechen. Die folgende Abbildung zeigt die
Filterung nach einem Eintrag in der Spalte "E_Jahr".

Der Filter ist aktiv. Dies ist an dem Filtersymbol mit einem grünen Haken zu erkennen. Das
Filtersymbol erscheint gedrückt. Wird der Button erneut betätigt, so bleibt der Filter selbst erhalten,
es werden aber wieder alle Datensätze angezeigt. So kann gegebenenfalls wieder in den
Filterzustand zurückgeschaltet werden.
Durch Betätigung des ganz rechts stehenden Filtersymbols lassen sich alle bereits veranlassten
Filterungen und Sortierungen wieder entfernen. Der Filter wird wieder inaktiv und kann nicht mehr
mit seinem alten Wert aufgerufen werden.

Eingabe von Daten in Tabellen

29

Tipp

In eine Tabelle, die gefiltert oder durch Suche eingegrenzt wurde, können dennoch ganz
normal Daten eingegeben werden. Sie bleiben so lange in der Tabellenansicht stehen,bis die Tabelle durch Betätigung des Buttons "Aktualisieren" aktualisiert wird.

Mit dem Standardfilter öffnet sich ein Fenster, in dem ähnlich der Sortierung eine Filterung übermehrere Zeilen ausgeführt werden kann. Ist bereits vorher ein AutoFilter eingestellt, so zeigt dieerste Zeile des Standardfilters bereits diesen vorgefilterten Wert an.

Abbildung 18: Umfangreiche Datenfilterung im Standardfilter
Der Standardfilter bringt viele Funktionen einer SQL-Datenfilterung mit. Die folgenden SQLBedingungen stehen zur Verfügung:Bedingung GUI

Beschreibung=

Vollständige Gleichheit, entspricht dem Begriff wie, wenn keine zusätzlichen
Platzhalterbezeichnungen verwendet werden.

<>

Ungleich<

Kleiner als<=

Kleiner als und gleich>

Größer als>=

Größer als und gleich

wie

Für Text, in Hochkommata geschrieben (' '); "_" für ein variables Zeichen,"%" für eine beliebige Anzahl variabler Zeichen. In SQL entspricht wie dem
Begriff LIKE

nicht wie

Umkehrung von wie, in SQL NOT LIKE

leer

Kein Inhalt auch nicht eine Leertaste. In SQL entspricht dies dem Begriff NULL

nicht leer

Umkehrung von leer, in SQL NOT NULL

Bevor die Verknüpfung eines Filterkriteriums mit dem nächsten Filterkriterium erfolgen kann, mussin der Folgezeile zumindest schon einmal ein Feldname ausgewählt worden sein. In der obigen
Abbildung steht dort statt eines Feldnamens "-keiner-", so dass die Verknüpfung inaktiv ist. Als
Verknüpfung stehen hier UND und ODER zur Verfügung.

30

TabellenAls Feldname kann hier sowohl ein neuer Feldname als auch ein bereits ausgewählter Feldnameerscheinen.
Selbst bei großen Datenbeständen dürfte sich bei geschickter Filterung die Anzahl der angezeigten
Datensätze mit diesen 3 Bedingungsmöglichkeiten doch auf einen übersichtlichen Bestandeingrenzen lassen.
Auch für die Filterung werden für Formulare in einem der folgenden Kapitel einige weitere
Möglichkeiten vorgestellt, die die GUI so nicht zur Verfügung stellt.

Eingabemöglichkeiten über SQL direkt
Die Eingabe direkt über SQL ist vor allem dann sinnvoll, wenn mehrere Datensätze mit einem
Befehl eingefügt, geändert oder gelöscht werden sollen.

Neue Datensätze einfügen
INSERT INTO "Tabellenname" [( "Feldname" [,...] )]{ VALUES("Feldwert" [,...]) | <Select-Formulierung>};
Wird kein "Feldname" benannt, so müssen die Felder komplett und in der richtigen Reihenfolge derTabelle als Werte übergeben werden. Dazu zählt auch das gegebenenfalls automatischhochzählende Primärschlüsselfeld. Die Werte, die übergeben werden, können auch das Ergebnis
einer Abfrage (<Select-Formulierung>) sein. Genauere Erläuterungen hierzu weiter unten.
INSERT INTO "Tabellenname" ("Feldname") VALUES ('Test');CALL IDENTITY();
In die Tabelle wird in der Spalte "Name" der Wert 'Test' eingegeben. Das automatischhochzählende Primärschlüsselfeld "ID" wird nicht angerührt. Der entsprechende Wert für die "ID"wird mit CALL IDENTITY() anschließend ausgelesen. Dies ist bei der Verwendung von Makros
wichtig, damit entsprechend mit dem Wert dieses Schlüsselfeldes weiter gearbeitet werden kann.
INSERT INTO "Tabellenname" ("Feldname") SELECT "anderer_Feldname" FROM"Name_anderer_Tabelle";
In die erste Tabelle werden jetzt so viele neue Datensätze in "Feldname" eingefügt, wie in der
Spalte "anderer_Feldname" der zweiten Tabelle enthalten sind. Die SELECT-Formulierung kannhier natürlich einschränkend wirken.

Bestehende Datensätze ändern
UPDATE "Tabellenname" SET "Feldname" = <Expression> [, ...] [WHERE<Expression>];Vor allem bei der Änderung vieler Datensätze bietet es sich an, doch einmal die SQLBefehlseingabe aufzusuchen. Angenommen alle Schüler einer Klasse sollen zum neuen Schuljahr
um eine Jahrgangsstufe heraufgesetzt werden:
UPDATE "Tabellenname" SET "Jahrgang" = "Jahrgang"+1
Schneller geht es nicht: Alle Datensätze werden mit einem Befehl geändert. Natürlich muss jetzt
noch nachgesehen werden, welche Schüler denn davon nicht betroffen sein sollen. Einfacher wäre
es, vorher in einem Ja/Nein-Feld die Wiederholungen anzukreuzen und dann nur diejenigen eine
Stufe heraufzusetzen, die nicht angekreuzt wurden:
UPDATE "Tabellenname" SET "Jahrgang" = "Jahrgang"+1 WHERE"Wiederholung" = FALSE
Diese Bedingung funktioniert allerdings nur dann, wenn das Feld nur die Werte FALSE und TRUE
annehmen kann, also nicht NULL. Sicherer wäre die Formulierung WHERE "Wiederholung" <>TRUE.

Eingabe von Daten in Tabellen

31

Auch andere Rechenschritte sind beim Update möglich. Wenn z.B. Waren ab 150,- € zu einem
Sonderangebot herausgegeben werden sollen und der Preis um 10% herabgesetzt werden sollgeschieht das mit dem folgenden Befehl:
UPDATE "Tabellenname" SET "Preis" = "Preis"*0,9 WHERE "Preis" >= 150

Bestehende Datensätze löschen
DELETE FROM "Tabellenname" [WHERE <Expression>];Ohne einen eingrenzenden Bedingungsausdruck wird durch
DELETE FROM "Tabellenname"der gesamte Inhalt der Tabelle gelöscht.
Da ist es dann doch besser, wenn der Befehl etwas eingegrenzt ist. Wird z.B. der Wert desPrimärschlüssels angegeben, so wird nur genau ein Datensatz gelöscht:
DELETE FROM "Tabellenname" WHERE "ID" = 5;
Sollen bei einer Medienausleihe die Datensätze von Medien, die zurückgegeben wurden, gelöscht
werden, so geht dies mit
DELETE FROM "Tabellenname" WHERE NOT "RueckgabeDatum" IS NULL;
oder alternativ mit
DELETE FROM "Tabellenname" WHERE "RueckgabeDatum" IS NOT NULL;

Mängel dieser Eingabemöglichkeiten
Eingaben mit einer Tabelle alleine berücksichtigt nicht die Verknüpfungen zu anderen Tabellen. Am
Beispiel einer Medienausleihe sei das hier verdeutlicht:

Die Ausleihtabelle besteht aus Fremdschlüsseln für das auszuleihende Medium Medien_ID und
den entsprechenden Nutzer Leser_ID sowie einem Ausleihdatum Leih_Datum. In die Tabelle
werden also bei der Ausleihe zwei Zahlenwerte (Mediennummer und Benutzernummer) und ein
Datum eingetragen. Der Primärschlüssel wird im Feld ID automatisch erstellt. Ob der Benutzer zu
der Nummer passt bleibt unsichtbar, es sei denn, eine zweite Tabelle mit den Benutzern wird
gleichzeitig offen gehalten. Ob das Medium mit der korrekten Nummer ausgeliehen wird ist
genauso wenig einsehbar. Hier muss sich die Ausleihe auf das Etikett auf dem Medium oder auf
eine weitere geöffnete Tabelle verlassen.
All dies lässt sich mit Formularen wesentlich besser zusammenfassen. Hier können die Nutzer unddie Medien durch Listenfelder nachgeschlagen werden. Im Formular stehen dann sichtbar die
Nutzer und die Medien, nicht die versteckten Nummern. Auch kann das Formular so aufgebaut
werden, dass zuerst ein Nutzer ausgewählt wird, dann das Ausleihdatum eingestellt wird und jede

32

Tabellen

Menge Medien diesem einen Datum durch Nummer zugeordnet werden. An anderer Stelle werden
dann diese Nummern wieder mit entsprechender genauer Medienbezeichnung sichtbar gemacht.
Die Eingabe in Tabellen ist in Datenbanken daher nur bei einfachen Tabellen sinnvoll. Sobald
Tabellen in Relation zueinander gesetzt werden, bietet sich besser ein entsprechendes Formularan. In Formularen können diese Relationen durch Unterformulare oder Listenfelder gut bedienbar
gemacht werden.

Eingabe von Daten in Tabellen

33