Erzeugen und Einstellen von Schemas mit MySQL
Eine Datenbankschema, kurz: Schema, ist ein benanntes Verzeichnis von Tabellenvariablen, es wird manchmal auch als „Datenbank“ (“database ”) bezeichnet. Das zugrundeliegende griechische Wort σχήμα bedeutet soviel wie „Form“ oder „Plan“.
Eine mögliche Aussprache des englischen Wortes “schema(s) ” ist /'skiːmə(z)/. Auf deutsch: „Das Schema“, Genitiv: „des Schemas“, Plural: „die Schemas“ und „Schemata“.
Verschiedene einfache Datenbanksysteme enthalten nur ein einziges Schema. Bei Verwendung solcher einfacher Datenbanksysteme entfallen die hier vorgestellten Kommandos.
Ein Schema namens »S« löschen
Durch das Löschen eines Schemas gehen alle darin enthaltenen Tabellen und alle in diesen Tabellen enthaltenen Informationen verloren.
Das folgende Kommando verlangt, das Schema mit dem Namen »S« zu löschen.
- Konsole (MySQL, S99:F381, S03:F381)
DROP SCHEMA S;
ERROR 1008 (HY000): Can't drop database 's'; database doesn't exist
- Aussprache
- drop drɑp
- Übersetzung der Fehlermeldung
FEHLER 1008 (HY000): Datenbank 's' kann nicht geloescht werden; Datenbank existiert nicht
Hier nehmen wir an, daß ein Schema mit dem Namen »S« bei der Eingabe des Kommandos nicht existiert. Es kann dann auch nicht gelöscht werden, und es erscheint eine entsprechende Fehlermeldung.
Das Löschen ist in SQL im allgemeinen ein sofort (ohne Rückfragen) vollzogenes Kommando, das im allgemeinen nicht rückgängig gemacht werden kann!
Es ist oft auf einfache Weise möglich, umfangreiche Datenbestände durch SQL -Kommandos zu beschädigen. Daher sollten bei Datenbanken mit wichtigen Informationen vorsichtig gearbeitet werden. Experimentelle Kommandos und Übungskommandos sollten nicht auf Datenbanksystem mit wichtigen Daten erprobt werden, sondern nur auf speziellen Datenkbanksystemen mit Daten, deren Verlust oder Beschädigung nicht zu Problemen führt.
Ein Schema namens »S« anlegen
Durch das folgende Kommando wird ein Schema namens »S« angelegt.
- Konsole (MySQL, S99:F171, S03:F171)
CREATE SCHEMA S;
Query OK, 1 row affected (0.00 sec)
- Übersetzung der Meldung
Abfrage in Ordnung, eine Zeile betroffen (0.00 Sek)
create kriˈeɪt
Ein Schema ist eine Voraussetzung für das spätere Anlegen von Tabellen, da alle Tabellen in einem Schema enthalten sein müssen.
Bezeichner in SQL (vereinfacht)
Ein Bezeichner ist eine Folge von mindestens einem Buchstaben (»A«, »B«, »C«, »D«, »E«, »F«, »G«, »H«, »I«, »J«, »K«, »L«, »M«, »N«, »O«, »P«, »Q«, »R«, »S«, »T«, »U«, »V«, »W«, »X«, »Y« und »Z«), und ab der zweiten Position sind auch Ziffern (»0«, »1«, »2«, »3«, »4«, »5«, »6«, »7«, »8« und »9«) erlaubt.
Bestimmte Wörter (wie beispielsweise »CREATE« oder »TABLE«) sind für spezielle Zwecke reserviert und gelten daher nicht als Bezeichner.
Wenn ein Benutzer einer Datenbank ein neues Schema anlegt, so kann er diesem einen Namen verleihen. Jener Name muß ein Bezeichner sein.
Groß- und Kleinschreibung ist bei Bezeichnern nicht signifikant. (Das heißt, daß ein klein geschriebener Bezeichner später auch groß geschrieben werden kann, um sich auf dieselbe Sache zu beziehen.)
Während die Schlüsselwörter in Entry-Level SQL 1992 auch klein geschrieben werden dürfen, müssen Bezeichner (wie beispielsweise Namen von Schemas oder Tabellen) dort ganz mit Versalien (großen Buchstaben) geschrieben werden. In MySQL wird dies aber nicht verlangt.
Siehe auch: Abschnitt 5.2 der ISO/IEC 9075.
Bezeichner in MySQL (vereinfacht)
Für Schema-Namen in MySQL gilt das zuvor Gesagte, mit der folgenden Änderung: Ein Schema-Name darf auch Grundstriche »_« und Dollarzeichen »$« enthalten, außerdem darf er auch mit einer Ziffer beginnen, aber nicht ausschließlich aus Ziffern bestehen.
In MySQL ist die Groß- und Kleinschreibung in Bezeichnern (Namen) signifikant (unterscheidend), wenn sie es in dem Dateisystem, in welchem die Daten abgespeichert werden, ist. Unter Microsoft® Windows ist sie also nicht signifikant. (Siehe http://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html.) Es ist empfehlenswert, eine einheitliche Schreibweise festzulegen und konsequent zu verwenden, beispielsweise solche Namen immer vollständig und durchgängig groß zu schreiben.
Siehe auch: http://dev.mysql.com/doc/refman/5.7/en/identifiers.html.
Ein Schema namens »S« als aktuelles Schema einstellen
Durch das Einstellen eines Schemas als aktuelles Schema beziehen sich die folgenden Kommandos auf diese Schema. (Kommandos, welche dem folgen können, werden etwas später vorgestellt werden.) Das Anlegen eines Tabellenspeichers erfolgt beispielsweise unter bestimmten Umständen in dem aktuellen Schema.
- Konsole — kein Standard-SQL , kein MySQL-Serverkommando
USE S
Database changed
- Übersetzung der Meldung
Datenbank verändert
Aussprache: “use ”, Verb: /juz/ (Substantiv: /jus/).
Dieses Kommando ist ein Kommando des MySQL-Monitors (des Klienten), nicht des MySQL-Servers. Es braucht daher auch nicht mit einem Semikolon abgeschlossen zu werden, wenn es auf einer Zeile für sich steht.
Diese mit »USE« vorgenommene Einstellung wirkt sich nur auf den Klienten und nur auf die Sitzung aus, innerhalb derer es eingegeben wurde. Nach einer Neuanmeldung muß es also erneut eingegeben werden.
Falls es ein Standard-SQL -Kommando gibt, das auch von MySQL verstanden wird, so wird meist dies in diesem Kurs vorgestellt. Andernfalls geben wir das Standard-SQL -Kommando manchmal separat an.
Das folgende Kommando von Standard-SQL stellt ein Schema als aktuelles Schema ein, es wird aber nicht von MySQL verstanden.
- Standard-SQL -Kommando (F92, F761 (1999), F761 (2003), S11 19.6) — kein MySQL
SET SCHEMA 'S';
Anzeige aller Schemata
Das folgende Kommando zeigt die vorhandenen Schemata an.
- Konsole
SHOW SCHEMAS;
Anzeige des derzeit eingestellten Schemas
Das folgende Kommando zeigt ein eventuell mit »USE« zuvor eingestellte Schema hinter dem Etikett »Current database:« an.
- Konsole
STATUS
Validatoren
- URIs einiger SQL-Validatoren
http://developer.mimer.com/sql-validator-test/
http://developer.mimer.com/sql-validator-99/
http://developer.mimer.com/sql-validator-92/
Für einige Abfragen geben wir im folgenden an, ob sie gemäß der Ausgabe von Validatoren auch dem Sprachstandard „Entry SQL-92“ (E92), „Core SQL-99“ (C99) und/oder „Core SQL-2003“ (C03) genügen.
- Konformitäten
- developer mimer se validator parser92: *** Entry SQL-92 *** (von nun an „E92“ genannt)
developer mimer se validator Mimer SQL-99 Validator (von nun an „S99“ genannt)
developer mimer com validator parser200x: Conforms to Core SQL-2003 (von nun an „C03“ genannt)
Diese Konformität wurde mit automatischen Prüfdiensten aus dem Web getestet.
- MySQL ein MySQL -Kommando
- S92 ein Standard-SQL -Kommando nach dem Standard von 1992 (eventuell nachfolgende Angaben bezeichnen den Teil des Standards)
- E92 ein Standard-SQL -Kommando nach dem Standard von 1992, Entry Level (ähnlich SQL-89)
- F92 ein Standard-SQL -Kommando nach dem Standard von 1992, full
- T92 ein Standard-SQL -Kommando nach dem Standard von 1992, Transitional
- I92 ein Standard-SQL -Kommando nach dem Standard von 1992, Intermediate
- S99 ein Standard-SQL -Kommando nach dem Standard von 1999
- C99 ein Standard-SQL -Kommando nach dem Standard von 1999, Core
- S03 ein Standard-SQL -Kommando nach dem Standard von 2003
- C03 ein Standard-SQL -Kommando nach dem Standard von 2003, Core
- S11 ein Standard-SQL -Kommando nach dem Standard von 2011
Falls ein Kommando einem Standard genügt, so genügt es in der Regel auch späteren Versionen des Standards, auch wenn dies nicht immer ausdrücklich so angegeben ist.
Im allgemeinen ist es aus Sicht der Kompatibilität besser, wenn ein Kommando einem älteren Standard (wie dem von 1992) entspricht, da solche Kommandos von vielen SQL -Datenbanksystemen unterstützt werden.
Syntax
Das folgende Syntaxdiagramm zeigt eine vereinfachte Syntax der Schema-Definition und der DROP-SCHEMA-Anweisung.
- Schemadefinition (vereinfacht)
.------. .------. .------------.
--->( CREATE )--->( SCHEMA )--->| Bezeichner |--->
'------' '------' '------------'- DROP-SCHEMA-Anweisung (vereinfacht)
.----. .------. .------------.
--->( DROP )--->( SCHEMA )--->| Bezeichner |--->
'----' '------' '------------'
Übungsaufgaben
/ Schema anlegen
Geben Sie die folgenden drei Kommandos in dieser Reihenfolge ein:
- ein Kommando zum Löschen eines Schemas namens »S« (hier ist eine Fehlermeldung »ERROR 1008« akzeptabel),
- ein Kommando zum Anlegen eines Schemas namens »S«,
- ein Kommando zum Einstellen des Schemas »S« als aktuelles Schema.
Zitate aus der Norm*
Das folgende Zitat aus der Norm zeigt das Semikolon »;« als Teil eines <direct SQL statement>.
9075-2 22 (Entwurf von 2010, vereinfacht)*
- 22 Direct invocation of SQL
- 22.1 〈direct SQL statement〉
- Function
- Specify direct execution of SQL.
- Format
- 〈direct SQL statement〉 ::=
- 〈directly executable statement〉 〈semicolon〉
- 〈directly executable statement〉 ::=
- 〈direct SQL data statement〉 |
- 〈SQL schema statement〉 |
- 〈SQL transaction statement〉 |
- 〈SQL connection statement〉 |
- 〈SQL session statement〉 |
- 〈direct implementation-defined statement〉
- direct SQL data statement〉 ::=
- 〈delete statement: searched〉 |
- 〈direct select statement: multiple rows〉 |
- 〈insert statement〉 |
- 〈update statement: searched〉 |
- 〈truncate table statement〉 |
- 〈merge statement〉 |
- 〈temporary table declaration〉
- 22.2
- <direct select statement: multiple rows> ::=
- <cursor specification>
- 14.3
- <cursor specification> ::=
- <query expression>
- 7.13
- <query expression> ::= … <query specification> …
- 7.12
- <query specification> ::= SELECT …
MySQL Löschen eines Schemas, nur falls es existiert ⃗
Das folgende Kommando löscht ein Schema namens »S«, falls diese existiert. Es kommt, im Gegensatz zum vorigen Kommando nicht zu einer Fehlermeldung, falls dieses Schema schon vorher nicht existiert.
An Stelle von »S« kann auch ein anderer Name verwendet werden.
Aussprache von “exists ”: /ɛgˈzɪsts/.
- Konsole (MySQL) – falls das Schema »S« vor der Eingabe des Kommandos existiert
DROP SCHEMA IF EXISTS S;
Query OK, 2 rows affected (0.19 sec)
- Konsole (MySQL) – falls das Schema »S« vor der Eingabe des Kommandos nicht existiert
DROP SCHEMA IF EXISTS S;
Query OK, 0 rows affected, 1 warning (0.00 sec)
Das »IF EXISTS« verhindert also nur eine Fehlermeldung, es bietet keine zusätzliche Funktion.
An Stelle von »S« kann auch ein anderer Name verwendet werden.
»IF EXISTS« ist kein Standard-SQL, sondern eine Erweiterung von MySQL.
MySQL »IF NOT EXISTS« ⃗
Wenn das Kommando statt mit »CREATE SCHEMA« mit »CREATE SCHEMA IF NOT EXISTS« beginnt, wird eine eventuelle Fehlermeldung vermieden, die erscheint, wenn ein Schema mit dem folgenden Namen schon existiert.
Solch eine Fehlermeldung kann für einen Benutzer, der SQL -Kommandos einzeln eingibt nützlich sein. Falls ein Skript jedoch nur sicherstellen will, daß ein Schema mit einem bestimmten Namen existiert, egal ob dies dazu neu angelegt werden muß oder nicht, kann es übersichtlicher sein, eine Fehlermeldung mit »IF NOT EXISTS« zu unterdrücken.
»IF NOT EXISTS« ist kein Standard-SQL, sondern eine Erweiterung von MySQL.
Syntax ⃗
Das folgende Syntaxdiagramm zeigt die vereinfachte Syntax der CREATE-SCHEMA- und DROP-SCHEMA-Anweisung. Dabei sind die roten Teile kein Teil von Standard-SQL .
- CREATE-SCHEMA-Anweisung (vereinfacht)
.------. .------. .------------. .-.
--->( CREATE )--->( SCHEMA )--->.------------------------------------->.--->| Bezeichner |--->( ; )--->
'------' '------' | ^ '------------' '-'
| |
| .--. .---. .------. |
'--->( IF )--->( NOT )--->( EXISTS )---'
'--' '---' '------'- DROP-Anweisung (vereinfacht)
.----. .------. .------------. .-.
--->( DROP )--->( SCHEMA )--->.-------------------------->.--->| Bezeichner |--->( ; )--->
'----' '------' | ^ '------------' '-'
| |
| .--. .------. |
'--->( IF )--->( EXISTS )---'
'--' '------'