Vorbemerkungen
Die Funktion "sql_update_befehle_testen()" aus dem Skript "__zac4web/__funktionen/z4w_sql_update.php", welches zu der Original-Version von "zac4web" gehört, werden von den Skripten der Original-Version genutzt, mit denen optionale Module installiert und die Datenbanktabellen der Original-Version und der Modultabellen strukturell aktualisiert werden können.
Die Funktion "sql_update_befehle_testen()" kann aber auch für projektspezifische Skripte genutzt werden, um SQL-Befehle für Datenbanktabellen des Projekts vor der Ausführung auf Syntaxfehler zu testen. Daher enthält die Tabelle weiter unten auch eine Spalte "projektspezifische Tabellen".
Die in diesem Skript enthaltenen Regeln für die SQL-Befehle sind die Regeln, welche die Prüffuntkon "sql_update_befehle_testen" akzeptiert. Die Regeln sind restriktiver als die Regeln für MySQL, um die Prüfung zügig durchführen zu können und insbesondere Systemtabellen vor unzulässigen Veränderungen zu schützen.
Erlaubte SQL-Befehle
In der nachfolgenden Tabelle bedeutet die Zeichenfolge "(X)", dass der jeweilige Befehl nur für ausgewählte Systemtabellen oder Modultabellen zulässig ist.
Die Namen fast aller Systemtabellen beginnen mit einem oder mehreren Unterstrichen, aber nicht mit der Zeichenfolge "_opt_". Zu den Systemtabellen gehören außerdem die Datenbanktabellen, deren Name mit der Zeichenfolge "home_" beginnt und die in der Datei db.sql der Original-Version genannt sind.
Die Namen der Datenbanktabellen, die zu optionalen Modulen gehören, die nicht als Bereich realisiert sind, beginnen immer mit der Zeichenfolge "_opt_". Für optionale Module, die als Bereich realisiert sind, beginnen die Namen der Datenbanktabellen immer mit der Zeichenfolge, die als interner Name des Bereichs verwendet wird (z.B. termin, zac4lav) gefolgt von einem Unterstrich.
Der Abschnitt Erläuterungen zu den Zeichenfolgen in den SQL-Befehlen enthält Hinweise, welche Zeichenfolgen die Prüffunktion sql_update_befehle_testen() für z.B. where-condition akzeptiert.
Allgemeine Syntax-Regeln für die SQL-Befehle
Die Prüffunktion "sql_update_befehle_testen()" akzeptiert die Befehle nur, wenn ...
- ... in dem Befehl alle Tabellennamen, Spaltennamen, Indexnamen und Constraint-Namen kein anderes Zeichen als die nachfolgend gelisteten Zeichen enthalten:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_ - ... in dem Befehl Tabellennamen, Spaltennamen, Indexnamen und Constraint-Namen jeweils von ` (Backticks) eingeschlossen sind.
- ... die Zeichenfolge ":=" nicht enthalten ist,
damit die Funktion nicht aufwändig prüfen muss, ob es sich um einen Zuweisungsoperator in einer WHERE-Anweisung oder eine "harmlose" Zeichenfolge innerhalb einer Zeichenkette wie einem Kommentar handelt. - ... jeder Befehl mit dem Semikolon ; beendet wird und zwischen einem Semikolon und dem Beginn des nächsten SQL-Befehls höchstens Whitespace-Zeichen (Leerzeichen, Zeilenumbrüche oder Tabulatorzeichen) vorhanden sind.
- ... die einzelnen Bestandteile (Bezeichner, Schlüsselwörter) innerhalb eines SQL-Befehls jeweils durch Whitespace-Zeichen getrennt sind.
Ausnahmen:
- Vor dem Semikolon am Ende des Befehls braucht kein Leerzeichen zu stehen.
- Vor dem Komma, welches für Aufzählungen in einem SQL-Befehl verwendet wird, braucht kein Whitespace-Zeichen zu stehen.
Unmittelbar vor und nach den Operatoren bei Wertzuweisungen brauchen keine Whitespace-Zeichen vorhanden zu sein.
Erläuterungen zu den Zeichenfolgen in den SQL-Befehlen
- coldefinition
- für Zeichenfolgen wie
- int UNSIGNED NOT NULL
- wenn nur positive ganze Zahlen oder die Zahl 0 in der Spalte notiert werden dürfen. - tinyint NOT NULL DEFAULT '0'
- wenn in der Spalte nur boolesche Werte erfasst werden sollen, und der NULL-Wert nicht erlaubt und der Standardwert die Zahl 0 sein soll. Dabei steht die Zahl '0' für den booleschen Wert false und alle anderen Zahlen, die in die Spalte eingetragen werden können (meist wird die Zahl '1' verwendet) für den booleschen Wert true. - varchar(3) DEFAULT 'w'
- wenn in der Spalte nur textuelle Werte mit einer maximalen Anzahl von 3 Zeichen erfasst werden sollen und beim INSERT-Befehl als Standardwert 'w' eingetragen werden soll, sofern diese Spalte im INSERT-Befehl in der Klammer vor "VALUES" nicht gelistet wird. - varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL
- wenn in der Spalte nur textuelle Werte mit einer maximalen Anzahl von 50 Zeichen erfasst werden sollen, abweichend zum Standardzeichensatz für die Datenbanktabelle für die Werte in der Spalte der Zeichensatz "utf8mb4" mit der Sortierreihenfolge "utf8mb4_german2_ci" gelten soll und der NULL-Wert eingetragen werden soll, falls diese Spalte im INSERT-Befehl in der Klammer vor "VALUES" nicht gelistet wird.
- int UNSIGNED NOT NULL
- für Zeichenfolgen wie
- zwischen zwei Backticks `
- `tn`, `tn_1`, `tn_2`, `tn_3`, `tn_new`, `tn_old` - für einen Tabellennamen
- `cn`, `cn_x`, `cn_1`, `cn_2`, `cn_q1`, `cn_z1`, `cn_new`, `cn_old` - für einen Spaltennamen
- `ik` - für einen Indexnamen
- `fk` - für den Namen einer Fremdschlüsselbeziehung
- `ck` - für den Namen einer Prüfbedingung
- zwischen zwei einfachen Hochkommata (= Apostroph)'
- 'w_x', 'w_x_1', 'w_x_2' - für einen Wert
- zwischen zwei eckigen Klammern []
- [...] - für Zeichenfolgen, die optional sind oder zusätzlich hinzugefügt werden können
- zwischen zwei geschweiften Klammern {}
- {... | ... } - für alternative Zeichenfolgen, von denen genau eine gewählt werden muss
- check-condition
- für Zeichenfolgen wie
- `cn_1` > 'w_x'
- damit kann für die Datensätze in der Tabelle `tn_1` der zulässige Wertebereich innerhalb der Spalte `cn_1` eingeschränkt werden. - `cn_1` <> `cn_2`
- damit kann erzwungen werden, dass für jeden Datensatz innerhalb der Tabelle die Werte in den Spalten `cn_1` und `cn_2` nicht identisch sind.
Wenn die Datentypen der beiden Spalten übereinstimmen, ist das Ergebnis der Bedingung immer eindeutig. Wurden aber den Spalten `cn_1` und `cn_2` unterschiedliche Datentypen zugewiesen, kann der Vergleich zu nicht erwarteten Ergebnissen führen, weil der Datenbank-Server unter Umständen für den Vergleich den Datentyp für den Wert der einen Spalte in den Datentyp der anderen Spalte umwandelt.
- `cn_1` > 'w_x'
Mit den Skripten der Original-Version von "zac4web" können CHECK-Constraints nur im Rahmen des Befehls "ALTER TABLE `tn` ADD CONSTRAINT ..." erzeugt werden. Dabei muss jeder Spaltenname `cn_x` in der Bedingung mit dem Namen einer Spalte der Tabelle `tn` übereinstimmen.
Als Vergleichsoperatoren akzeptieren die Skripte nur die Zeichenfolgen aus der nachfolgenden runden Klammer (!=, <>, >=, <=, <, > LIKE, NOT LIKE, !LIKE).
- für Zeichenfolgen wie
- where-condition
Beginnt immer mit dem Schlüsselwort WHERE.
Darauf folgt dann eine Bedingung oder mehrere durch logische Operatoren (AND, OR, XOR) miteinander verknüpfte und mit runden Klammern geklammerte Bedingungen. Die gesamte where-condition wird vom Datenbank-Server für jeden Datensatz der Tabelle ausgewertet. Der zugehörige Befehl wird für die Datensätze ausgeführt, für welche die gesamte where-condition den booleschen Wert true ergibt.
Für die Prüffunktion sql_update_befehle_testen() muss jede Bedingung wie folgt aufgebaut sein:- Jede Bedingung muss mit einem in Backticks notierten Spaltennamen `cn_x` aus der Tabelle `tn` beginnen.
- Auf den Spaltennamen in Backticks muss ein Vergleichsoperator oder die beiden beiden Aussagen "IS NULL", "IS NOT NULL" folgen. Als Vergleichsoperatoren können die Zeichenfolgen aus der nachfolgenden runden Klammer (LIKE, =, <=>, NOT LIKE, !LIKE, !=, <>, >=, <=, <, >) eingesetzt werden.
- Wird ein Vergleichsoperator eingesetzt, darf darauf nur eine Zeichenfolge oder eine Zahl als Vergleichswert folgen.
Auch sind damit bei der Nutzung der Prüffunktion sql_update_befehle_testen() keine SELECT-Abfragen innerhalb der where-condition erlaubt. - value
- für eine positive Integerzahl
Im Gegensatz zu den Backticks und den Hochkommata, die in den SQL-Befehlen für das Update-Skript zusammen mit dem Namen bzw. Wert notiert werden müssen, werden die eckigen Klammern (und die geschweiften Klammern), welche in den Befehlen in der Tabelle optionale Zeichenfolgen (bzw. obligatorische alternative Zeichenfolgen) andeuten, niemals geschrieben.
Unterstützte Spaltendefinitionen in den SQL-Befehlen
Im Befehl "CREATE TABLE `tn` ..." muss mindestens eine Spaltendefinition und in den drei Befehlen "ALTER TABLE `tn` ADD COLUMN `cn` ...", "ALTER TABLE `tn` CHANGE COLUMN `cn` ..." und "ALTER TABLE `tn` MODIFY COLUMN `cn` ..." muss jeweils genau eine Spaltendefinition enthalten sein.
Eine Spaltendefinition beginnt immer mit der Angabe, welche Art von Werten (= Datentyp) in der Spalte erlaubt sind. Von dem Datentyp hängt dann ab, welche weitere Angaben in der Spaltendefinition enthalten sein müssen bzw. dürfen.
Für alle Datentypen kann optional festgelegt werden, ob der Wert NULL in der Spalte erlaubt ist oder nicht [{NULL | NOT NULL}]. Wenn keiner der beiden optionalen Werte zugeordnet ist, gilt für die meisten Datentypen implizit "NOT NULL", es sei denn, es steht gleichzeitig in der Spaltendefinition "DEFAULT NULL".
Für die Spalten mit den Datentypvarianten "...BLOB" und "...TEXT" darf in der Spaltendefinition keine DEFAULT-Anweisung stehen. Für alle anderen Datentypen kann mit der DEFAULT-Anweisung ein Vorgabewert festgelegt werden, der dann beim Einfügen eines neuen Datensatzes zugeordnet wird, wenn für die Spalte kein Wert übermittelt wird. Diese DEFAULT-Anweisung kann bei jedem dieser Datentypen auch "DEFAULT NULL" lauten. Dann darf aber nicht gleichzeitig in der Spaltendefinition explizit "NOT NULL" gefordert werden, da diese beiden Anweisungen sich gegenseitig ausschließen.
Das Skript Datenbanktabellen - Spaltentypen und Werteenthält weitere Hinweise zu den Datentypen, die für die Auswahl des geeigneten Datentyps aber nicht für den Aufbau der Spaltendefinition relevant sind.
Spalten für Zahlen
Spalten für Ganzzahlen (Integerzahlen)
Aufbau der akzeptierten Spaltendefiniton:
datentyp [{UNSIGNED | SIGNED}] [{NULL | NOT NULL}] [DEFAULT x] [{AUTO_INCREMENT | AUTO_INCREMENT, AUTO_INCREMENT=ganzzahl}]
- für "datentyp" werden folgende Angaben akzeptiert: INT, INTEGER, TINYINT, SMALLINT, MEDIUMINT, BIGINT.
- Als Vorgabewert x in der optionalen DEFAULT-Anweisung sind neben dem Wert NULL nur positive und negative Ganzzahlen zulässig.
- Pro Tabelle darf maximal eine Spalte als AUTO_INCREMENT-Spalte festgelegt werden.
Bei den von sql_update_befehle_testen() erlaubten Befehlen muss die Spalte bereits vorhanden sein und als Primär-Index-Spalte festgelegt sein, wenn in der Spaltendefinition eine AUTO-INCREMENT-Anweisung enthalten ist. Die AUTO-INCREMENT-Anweisung ist bei den von sql_update_befehle_testen() akzeptierten Befehlen daher nur in den beiden Befehlen "ALTER TABLE `tn` MODIFY COLUMN `cn` ..." und "ALTER TABLE `tn` CHANGE COLUMN `cn` ..." sinnvoll.
Falls bereits Datensätze in der Tabelle enthalten sind, ist die erweiterte AUTO_INCREMENT-Anweisung, bei der ein Integerwert zugeordnet wird, anzuwenden, wobei der Wert von ganzzahl dann mindestens um 1 höher sein muss, als der bereits zugeordnete höchste Wert in dieser Spalte.
Die Einhaltung der Bedingungen rund um das AUTO-INCREMENT-Attribut überwacht der MySQL-Server.
Die Angabe einer Ganzzahl in runden Klammern nach "datentyp" und das Attribut ZEROFILL wird von sql_update_befehle_testen() nicht akzeptiert, weil beides in der MySQL-Dokumentation als veraltet gekennzeichnet ist.
Spalten für Fließkommazahlen
Aufbau der akzeptierten Spaltendefiniton:
datentyp [{NULL | NOT NULL}] [DEFAULT x]
- für "datentyp" werden folgende Angaben akzeptiert: FLOAT, DOUBLE, DOUBLE PRECISION, REAL.
- Als Vorgabewert x in der optionalen DEFAULT-Anweisung sind neben dem Wert NULL nur positive und negative Zahlen zulässig.
MySQL erlaubt zwar für Fließkommazahlen in der Spaltendefinition die Angabe der Präzision durch Angabe der Ziffern insgesamt und der Anzahl der Dezimalstellen. Dies wird aber von der Funktion sql_update_befehle_testen() nicht unterstützt, weil diese Präzision auch durch die Wahl des Datentyps DECIMAL (oder eines Synonyms dafür) erzielt werden kann.
Die Angabe der beiden Attribute UNSIGNED und ZEROFILL werden von sql_update_befehle_testen() für diese Datentypen nicht akzeptiert, weil beides in der MySQL-Dokumentation als veraltet gekennzeichnet ist.
Spalten für Dezimalzahlen mit fixierter Anzahl an Dezimalstellen
Aufbau der akzeptierten Spaltendefiniton:
datentyp [(M [,D])] [{NULL | NOT NULL}] [DEFAULT x]
- für "datentyp" werden folgende Angaben akzeptiert: DECIMAL, DEC, FIXED, NUMERIC.
- Mit dem optionalen "(M [,D])" kann der zulässige Zahlenbereich vorgegeben werden. Durch die Ganzzahl M (0 < M < 66) wird dabei gesteuert, wie viele Ziffern für die Zahl maximal gespeichert werden (Stellen vor und nach dem Dezimaltrennzeichen). Mit der Ganzzahl D (D < M) kann festgelegt werden, wie viele Dezimalstellen eine Zahl genau enthalten wird, dabei wird später bei der Eingabe und Aktualisierung von Datensätzen für jede fehlende Dezimalstelle die Ziffer 0 angehängt. Fehlt die optionale Angabe "(M [,D])" vollständig oder nur die Angabe zu D, gelten die Vorgaben des MySQL-Servers für diesen Datentyp hinsichtlich der Anzahl der Dezimalstellen (D) und der maximalen Anzahl an Ziffern (M).
Wenn die optionale Anweisung "(M [,D])" vorhanden ist, prüft die Funktion sql_update_befehle_testen() legiglich, ob M und D nur aus Ziffern bestehen. Die anderen Bedingungen bezüglich der Werte M und D überwacht der MySQL-Server. - Als Vorgabewert x in der optionalen DEFAULT-Anweisung sind neben dem Wert NULL nur positive und negative Zahlen zulässig.
Die Angabe der beiden Attribute UNSIGNED und ZEROFILL werden von sql_update_befehle_testen() für diese Datentypen nicht akzeptiert, weil beides in der MySQL-Dokumentation als veraltet gekennzeichnet ist.
Spalten für Zeichenfolgen
Spalten für Zeichenfolgen, die mit Angabe der Zeichenkodierung gespeichert werden
Bei der Spaltendefinition für diese Datentypen kann angegeben werden, welche Zeichenkodierung und ggf. welche Sortierreihenfolge für die Zeichenketten, die in den Zellen dieser Spalte gespeichert werden können, gelten sollen.
Mit der optionalen Angabe [DEFAULT CHARSET zk_codierung] kann lediglich die Zeichenkodierung für die Zeichenketten in der Spalte vorgegeben werden. Statt "CHARSET" darf auch die Langform "CHARACTER SET" notiert werden.
Soll aber neben der Zeichenkodierung auch die Sortierreihenfolge für die Zeichenketten innerhalb der Spalte vorgegeben werden, reicht die optionale Angabe "COLLATE zk_collate" dafür aus, da die Zeichenfolge für zk_collate auch immer angibt, welche zk_codierung gelten soll.
Wenn die Zeichenfolgen für zk_codierung und zk_collate mindestens ein Leerzeichen enthalten, müssen zk_codierung bzw. zk_collate in Backticks notiert werden.
Wird in der Spaltendefintion auf die Angabe zur Zeichenkodierung bzw. zur Sortierreihenfolge verzichtet, gilt für die Zeichenketten, die in dieser Spalte gespeichert werden, die Zeichenkodierung und Sortierreihenfolge, die für die Tabelle gilt.
Datentypen für Zeichenfolgen, die innerhalb der Tabelle gespeichert werden
Datentypen für beliebige Zeichenfolgen
Aufbau der akzeptierten Spaltendefiniton:
datentyp (size) [DEFAULT CHARSET zk_codierung] [COLLATE zk_collate] [{NULL | NOT NULL}] [DEFAULT zk]
- für "datentyp" werden folgende Angaben akzeptiert: CHAR, NCHAR, NATIONAL CHAR, VARCHAR, NVARCHAR, NATIONAL VARCHAR.
- Mit der obligatorischen Angabe (size) muss festgelegt werden, wie viele Zeichen in jeder Zelle dieser Spalte maximal gespeichert werden dürfen.
- Als Vorgabewert zk sind in der optionalen DEFAULT-Anweisung neben dem Wert NULL beliebige Zeichenketten erlaubt.
Soll ein anderer Wert als NULL der Vorgabewert sein, muss dieser in der DEFAULT-Anweisung von einfachen Hochkommata umschlossen sein. Wenn die leere Zeichenkette der Vorgabewert sein soll, darf zwischen diesen beiden Hochkommata kein weiteres Zeichen stehen. Falls der Vorgabewert zk ein Apostroph enthalten soll, muss das Apostroph innerhalb der Zeichenkette zk durch einen Backslash auskommentiert werden.
Datentypen, bei denen der Nutzer nur Zeichenfolgen aus einer vorgegebenen Menge wählen kann
Aufbau der akzeptierten Spaltendefiniton:
datentyp ('w_1'[, ...]) [DEFAULT CHARSET zk_codierung] [COLLATE zk_collate] [{NULL | NOT NULL}] [DEFAULT zk]
- für "datentyp" werden folgende Angaben akzeptiert: SET, ENUM.
- Mit der obligatorischen Angabe ('w_1'[, ...]) muss mindestens eine Zeichenfolge "w_1" festgelegt werden, die als Wert für die Zellen in dieser Spalte gewählt werden kann.
Meist wird aber innerhalb der runden Klammer eine kommaseparierte Aufzählung von Zeichenfolgen notiert. Dabei muss jede Zeichenfolge innerhalb der Liste jeweils durch Hochkommata gekapselt sein.
Falls einer der Listeneinträge ein Apostroph enthalten soll, muss das Apostroph innerhalb der Zeichenkette durch einen Backslash auskommentiert werden.
Besteht einer der Listeneinträge in der runden Klammer nur aus zwei Hochkommata, bedeutet dieses, dass die leere Zeichenkette als Wert erlaubt ist.
Weil in der Klammer die zugelassenen Werte jeweils in Hochkommate gekapselt werden müssen, kann der Wert NULL nicht innerhalb der Liste notiert werden. Der NULL-Wert ist aber automatisch zugelassen, wenn nach der Spaltendefinition nicht die Anweisung "NOT NULL" folgt. - Als Vorgabewert zk kann in der optionalen DEFAULT-Anweisung entweder der Wert NULL oder eine beliebige Zeichette notiert werden, die durch Hochkommata gekapselt ist. Die Zeichenfolge muss nicht als ein Wert innerhalb der Liste ('w_1'[, ...]) vorhanden sein.
Datentypen für Zeichenfolgen, die außerhalb der Tabelle gespeichert werden und für die in der Tabelle jeweils nur ein Verweis notiert wird, wo der MySQL-Server die Zeichenfolge abgelegt hat.
Aufbau der akzeptierten Spaltendefiniton:
datentyp [DEFAULT CHARSET zk_codierung] [COLLATE zk_collate] [{NULL | NOT NULL}]
- für "datentyp" werden folgende Angaben akzeptiert: TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT.
Abweichend zu den Datentypen, deren Zeichenfolgen in der Tabelle gespeichert werden, ist für diese Datentypen kein Vorgabewert erlaubt.
Die maximale Anzahl der Zeichen kann bei diesen Datentypen nur sehr grob durch die Wahl des Datentyps beeinflusst werden.
Spalten für Zeichenfolgen, die als Binärdaten gespeichert werden
Datentypen für Zeichenfolgen, die innerhalb der Tabelle gespeichert werden
Aufbau der akzeptierten Spaltendefiniton:
datentyp ❬(size)❭ [{NULL | NOT NULL}] [DEFAULT zk]
- für "datentyp" werden folgende Angaben akzeptiert: BINARY, VARBINARY.
- Das spitze Klammerpaar ❬ ❭ soll darauf hinweisen, dass die Angabe "(size)" bei dem Datentyp VARBINARY obligatorisch und bei dem Datentyp BINARY optional ist. Diese spitzen Klammern dürfen in der coldefinition nicht geschrieben werden.
Mit der Angabe (size) muss bei dem Datentyp VARBINARY und kann bei dem Datentyp BINARY festgelegt werden, wie viele Zeichen in jeder Zelle dieser Spalte maximal gespeichert werden dürfen. Fehlt die Angabe (size) bei dem Datentyp BINARY wird vom MySQL-Server für size automatisch die Zahl 1 verwendet. - Als Vorgabewert zk sind in der optionalen DEFAULT-Anweisung neben dem Wert NULL beliebige Zeichenketten erlaubt.
Soll ein anderer Wert als NULL der Vorgabewert sein, muss dieser in der DEFAULT-Anweisung von einfachen Hochkommata umschlossen sein. Wenn die leere Zeichenkette der Vorgabewert sein soll, darf zwischen diesen beiden Hochkommata kein weiteres Zeichen stehen. Falls der Vorgabewert zk ein Apostroph enthält, muss das Apostroph innerhalb der Zeichenkette zk durch einen Backslash auskommentiert werden.
Datentypen für Zeichenfolgen, die außerhalb der Tabelle gespeichert werden und für die in der Tabelle jeweils nur ein Verweis notiert wird, wo der MySQL-Server die Zeichenfolge abgelegt hat.
Aufbau der akzeptierten Spaltendefiniton:
datentyp [{NULL | NOT NULL}]
- für "datentyp" werden folgende Angaben akzeptiert: TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB.
Abweichend zu den Datentypen, deren Zeichenfolgen in der Tabelle gespeichert werden, ist für diese Datentypen kein Vorgabewert erlaubt.
Die maximale Anzahl der Zeichen kann bei diesen Datentypen nur sehr grob durch die Wahl des Datentyps beeinflusst werden.
Nicht unterstützte Datentypen
Datentypen für boolesche Werte
Von der Funktion sql_update_befehle_testen() wird kein spezifischer Datentyp für boolesche Werte unterstützt, da es in MySQL keinen eigenständigen Datentyp dafür gibt.
MySQL bietet zwar mit den Bezeichnern "BOOLEAN" und "BOOL" scheinbar einen Datentyp speziell für boolesche Werte an, doch wenn die Spalte erzeugt wird, wird stattdessen der Datentyp "TINYINT" der Spalte zugewiesen, obwohl in Spalten mit diesem Datentyp inkl. des NULL-Wertes 256 verschiedene Werte je Zelle zur Auswahl stehen und für die Speicherung von booleschen Werte nur 2 verschiedene Werte benötigt werden. Möchte man erreichen, dass der MySQL-Server bei dem Datenyp "TINYINT" in der Spalte `cn` nur die beiden Zahlen 0 und 1 speichert, sind dafür neben der Anweisung NOT NULL die beiden Anweisungen "CHECK (`cn` > -1)" und CHECK (`cn` < 2) für die Spalte erforderlich, .
Mit dem Datentyp ENUM kann dagegen ohne weitere Anweisungen eine Spalte definiert werden, in der vom MySQL-Server tatsächlich nur zwei verschiedene Werte gespeichert werden können. Wenn man die beiden alternativen Werte in der Liste innerhalb der Spaltendefintion notieren möchte (z.B. 'x', ''), muss man zusätzlich für die Spalte NOT NULL und entweder DEFAULT 'x' oder DEFAULT '' notieren. Es ist aber auch möglich, nur einen Wert in der Liste zu notieren und diesen mit DEFAULT NULL für die Spalte zu kombinieren. Auch die Kombination von nur einem Wert 'zk_1' in der Liste mit den Anweisungen "NOT NULL" und DEFAULT 'zk_2' für die Spalte, lässt in der Spalte nur zwei verschiedene Werte zu.
Alternativ können für die Speicherung von booleschen Werten auch die Datentypen für Zeichenfolgen verwendet werden, bei denen die Anzahl der Zeichen auf genau 1 beschränkt werden kann. Allerdings sind bei diesen Datentypen fast immer noch mehr alternative Werte je Zelle als bei dem Datentyp "TINYINT" möglich, so dass auch bei diesen Datentypen durch ergänzende Maßnahmen entweder sichergestellt werden muss, das nur zwei verschiedene Werte in den Zellen der Spalte gespeichert werden, oder festgelegt werden muss, welche(r) Wert(e) als "false" interpretiert werden sollen und welche(r) als "true".
Datentypen für Zeit- und Datumsangaben
Die von MySQL angeboteten Datentypen "DATE", "TIME", "DATETIME", "TIMESTAMP" und "YEAR" werden von der Funktion sql_update_befehle_testen() nicht akzeptiert.
Stattdessen werden von "zac4web" zum Speichern von Zeit- und Datumsangaben, die als Zahl vorliegen, die Datentypen für Ganzzahlen genutzt. Und für formatierte Zeitangaben (z.B. 25.06.2025) verwendet "zac4web" meist den Datentyp VARCHAR. Alternativ könnten auch sehr gut die anderen Datentypen für Zeichenfolgen verwendet werden, die innerhalb der Tabelle gespeichert werden.
Bei der Speicherung der Zeit- und Datumsangaben als Ganzzahlen oder als Zeichenfolgen können die gespeicherten Werte nicht ohne Aufbereitung an Funktionen des MySQL-Servers zur Berechnung übergeben werden. "zace4web" nutzt allerdings die MySQL-Datenbank bislang nur zur Speicherung von Daten und stellt an den MySQL-Server lediglich Anfragen zum Speichern, Verändern, Löschen und Auslesen von Datensätzen. Daher benötigt "zac4web" nicht die spezifischeren Datentypen, die MySQL für Zeit- und Datumsangaben anbietet.
Hinweise zu weiteren Datentypen, die von MySQL angeboten werden
Weil "zac4web" Daten bislang nur in Form von Zahlen und Zeichen betrachtet und verarbeitet, und für diese Daten als Speicherplatz jeweils mindestens 1 Byte oder ein ganzzahliges Vielfaches davon benötigt wird, akzeptiert die Funktion sql_update_befehle_testen() nicht den Datentyp "BIT".
Da "zac4web" auch nicht mit geographischen Daten rechnet oder diese graphisch darstellen möchte, akzeptiert die Funktion sql_update_befehle_testen() keine der von MySQL angebotenen "SPATIAL DATA TYPES".
"zac4web" nutzt zwar Javascript-Funktionen, speichert allerdings keine Daten als JSON-Objekte in der Datenbank. Daher wird der JSON DATA TYPE ebefalls nicht von der Funktion sql_update_befehle_testen() akzeptiert.
Erläuterungen zu den SQL-Befehlen
Befehl | Hinweise |
---|---|
INSERT INTO `tn` (`cn_1` [,...]) VALUES ('...' [,...]) [, ('...' [, ...]) ]; | Mit diesem Befehl kann ein Datensatz oder können mehrere Datensätze in die Tabelle `tn` eingefügt werden. Nach dem Tabellennamen `tn` folgt in runden Klammern nur der Name der Spalte `cn_1`, wenn dem/jedem neuen Datensatz lediglich für diese Spalte ein Wert zugewiesen werden soll. Wenn mit dem INSERT-Befehl jedem neuen Datensatz für verschiedene Spalten Werte zugewiesen werden sollen, sind sämtliche Spaltennamen zu listen, für welche Werte im INSERT-Befehl angegeben werden sollen. Zwischen den Spaltennamen ist jeweils ein Komma zu schreiben. Besitzt die Tabelle `tn` eine Spalte mit der Eigenschaft "AUTO_INCREMENT", so darf der Name dieser Spalte im INSERT-Befehl nicht in der runden Klammer nach dem Tabellennamen `tn` genannt werden, weil der Wert in dieser Spalte vom MySQL-Server automatisch zugewiesen wird. Spalten, für welche explizit ein DEFAULT-Wert im Rahmen der coldefinition vorgegeben wurde, brauchen in der runden Klammer nach dem Tabellennamen nicht genannt zu werden, wenn allen Datensätzen, welche mit dem INSERT-Befehl eingefügt werden sollen, jeweils der Standardwert für diese Spalte zugewiesen werden soll. Für alle anderen Spalten der Tabelle `tn` wird empfohlen, den Spaltennamen in der runden Klammer nach dem Tabellennamen zu nennen, da der MySQL-Server beim Fehlen eines Spaltennamens den INSERT-Befehl ablehnt, wenn der STRICT-Modus eingestellt ist. Die Prüffunktion aus der Original-Version akzeptiert nach der Liste mit den Spaltennamen nur das Schlüsselwort "VALUES". Folgt nach dem Schlüsselwort "VALUES" vor dem Semikolon nur ein Ausdruck, der von runden Klammern umgeben ist, kann damit ein Datensatz in die Tabelle `tn` eingefügt werden. Sollen mehrere Datensätze eingefügt werden, ist für jeden Datensatz ein identisch aufgebauter Ausdruck, der von runden Klammern umgeben ist, vor dem Semikolon zu notieren. Zwischen den geklammerten Ausdrücken ist jeweils ein Komma zu notieren. In der runden Klammer für einen Datensatz müssen immer exakt so viele Werte notiert werden, wie Spaltennamen in der runden Klammer vor dem Schlüsselwort "VALUES" enthalten sind. Zwischen den Werten ist jeweils ein Komma als Trennzeichen zu setzen. Jeder Wert ist mit Hochkommata ' zu "klammern", auch wenn der Wert eine Zahl ist. Nur wenn einem Datensatz explizit der NULL-Wert in einer Spalte zugewiesen werden soll, sind für den NULL-Wert nur die vier Buchstaben der Zeichenfolge "null" zu notieren. Diese vier Buchstaben können groß oder klein geschrieben werden. |
UPDATE `tn` SET `cn_1`=wert [,...]) where-condition; | Mit diesem Befehl kann der Wert von Datensätzen in der Tabelle `tn` in den Spalten, deren Namen nach SET genannt werden, angepasst werden. Die Werte werden nur für die Datensätze verändert, welche die where-condition erfüllen. Nach der MySQL-Syntax dürfen innerhalb der where-condition auch SELECT-Abfragen wie "`cn_x` IN (SELECT ...)" oder "`cn_x` NOT IN (SELECT ...)" verwendet werden. Diese Abfragen sind dann erforderlich, wenn die Veränderung abhängig sein soll von einem oder mehreren Wert/en, die für einen verknüpften Datensatz gelten. Die Prüffunktion sql_update_befehle_testen() akzeptiert aber noch keine SELECT-Abfragen. Auch dürfen nach der MySQL-Syntax auf die where-condition noch [ORDER BY ...] [LIMIT value] folgen, wodurch gesteuert werden kann, für wie viele und welche Datensätze der UPDATE-Befehl zutrifft, falls die where-Bedingung auf mehr Datensätze zutrifft als durch die Beschränkung in der LIMIT-Anweisung. Dies wird aber bislang ebenfalls nicht unterstützt. |
DELETE FROM `tn` where-condition; | Mit diesem Befehl können Datensätze aus der Tabelle `tn` gelöscht werden. Nur die Datensätze werden gelöscht, welche die where-condition erfüllen. Für den DELETE-Befehl sind - wie für den UPDATE-Befehl - bislang weder die SELECT-Abfragen innerhalb der where-condition noch die Beschränkung durch LIMIT innerhalb der Prüffunktion realisiert. |
CREATE TABLE `tn` (`cn` coldefinition [COMMENT 'comment_c'] [, ...]) [ [ENGINE=InnoDB] [DEFAULT CHARSET=...] [COLLATE=...] [COMMENT 'comment_t'] ]; | Mit diesem Befehl wird eine Tabelle mit mindestens einer Spalte erzeugt. [, ...] steht dabei für beliebig viele weitere Spalten, die ebenfalls bei der Anlage der Tabelle sofort erzeugt werden sollen. Für jede dieser Spalten ist der Spaltenname und die Spaltendefinition zu notieren. Nach der runden Klammer, mit welcher die (letzte) Spaltendefinition endet, können noch vier optionale Anweisungen folgen. Wenn zwei oder mehr von diesen Anweisungen vorkommen sollen, akzeptiert die Prüffunktion diese allerdings nur, wenn die Reihenfolge eingehalten wird. Durch die Anweisung "ENGINE=InnoDB" kann erzwungen werden, dass der Tabellentyp InnoDB ist. Dies ist bislang der einzige Tabellentyp der von der Prüffunktion akzeptiert wird. Möchte man festlegen welcher Zeichensatz standardmäßig für textuelle Werte innerhalb der Tabelle und welche Sortierreihenfolge innerhalb dieser Spalten gelten soll, kann als nächstes innerhalb des CREATE-Befehls eine Zeichenfolge wie "DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_german2_ci" notiert werden. Wenn die Bezeichner für den Zeichensatz und die Sortierreihenfolge allerdings ein Zeichen enthalten, das nicht für Tabellennamen zulässig sind, müssen die Bezeichner in Backticks geschrieben werden. Vor dem Semikolon darf als letztes die Zeichenfolge "COMMENT 'comment_t'" folgen, mit dem ein Kommentar zur Tabelle hinzugefügt werden kann. |
ALTER TABLE `tn` COMMENT 'comment_t'; | Mit diesem Befehl kann ein Kommentar zu einer Tabelle hinzugefügt oder geändert werden. War der Tabelle bislang ein Kommentar zugeordnet, wird dieser durch den Wert von 'comment_t' ersetzt. Ist 'comment_t' die leere Zeichenkette, wird der bisher zugeordnete Kommentar gelöscht. |
ALTER TABLE `tn` INSERT_METHOD {N0 | FIRST | LAST}; | Dieser Befehl legt fest, an welcher Position (FIRST | LAST) neue Datensätze in einer Tabelle notiert werden oder ob das Einfügen von neuen Datensätzen verboten ist (NO). Für Systemtabellen und Modultabellen werden nur die Werte FIRST und LAST akzeptiert. |
TRUNCATE TABLE `tn`; | Mit diesem Befehl können alle Datensätze in einer Tabelle gleichzeitig gelöscht werden. Der Befehl kann scheitern, wenn für eine andere Tabelle eine Fremdschlüsselbeziehung zu der Tabelle `tn` existiert. |
DROP TABLE [IF EXISTS] `tn`; | Mit diesem Befehl kann eine Tabelle aus der Datenbank entfernt werden. Der Befehl kann scheitern, wenn für eine andere Tabelle eine Fremdschlüsselbeziehung zu der Tabelle `tn` existiert. Soll der Befehl keinen Fehler auslösen, wenn die Tabelle `tn` nicht vorhanden ist, muss im Befehl das optionale "IF EXISTS" notiert werden. |
ALTER TABLE `tn` ADD COLUMN `cn` coldefinition [COMMENT 'comment_c'] [{FIRST | AFTER `cn_x`}]; | Mit diesem Befehl kann eine Spalte in eine Tabelle eingefügt werden. Wenn ein Kommentar zu der Spalte notiert werden soll, muss dieser unmittelbar auf die coldefinintion folgen und mit dem Schlüsselwort COMMENT gekennzeichnet sein. Als letztes darf dann in dem Befehl noch das optionale "FIRST" stehen, wird die neu eingefügte Spalte die erste Spalte innerhalb der Tabelle. Alternativ ist auch das optionale "AFTER `cn_x`" möglich. Damit wird die neue Spalte hinter der Spalte `cn_x` eingefügt. Fehlt die optionale Positionierungsangabe für die Spalte, ist die neu eingefügte Spalte, die letzte Spalte in der Tabelle. |
ALTER TABLE `tn` MODIFY COLUMN `cn` coldefinition [COMMENT 'comment_c'] [{FIRST | AFTER `cn_x`}]; | Nach der erfolgreichen Ausführung des Befehls gelten für die Spalte `cn` nur noch die Defintionen, die in der coldefinition dieses Befehls enthalten sind. Sollen also für die Spalte `cn` bereits zuvor festgelegte Bedingungen weiterhin gelten, müssen diese im MODIFY-Befehl erneut notiert werden. Sind in der Tabellenspalte bereits Werte vorhanden, verhindern diese möglicherweise die Ausführung des Befehls oder die Werte werden evtl. angepasst. Auch eine Fremdschlüsselbeziehung zwischen der Tabellenspalte `cn` und einer anderen Spalte kann die Veränderung der Spaltendefinition verhindern. Falls der Spalte zuvor ein Kommentar zugeordnet war, muss die Zeichenfolge 'comment_c' dafür mit der Anweisung COMMENT 'comment_c' erneut zugewiesen werden. Ansonsten wird der Kommentar entfernt. Mit dem optionalen "FIRST" oder alternativen "AFTER `cn_x`" kann die Position der Spalte innerhalb der Spaltenreihenfolge verändert werden. |
ALTER TABLE `tn` CHANGE COLUMN `cn_old` `cn_new` coldefinition [COMMENT 'comment_c'] [{FIRST | AFTER `cn_x`}]; | Dieser Befehl ist vom Funktionsumfang her eine Erweiterung des Befehls "ALTER TABLE `tn` MODIFY COLUMN ...". Zusätzlich kann mit diesem Befehl der Name der Datenbanktabelle von `cn_old` zu `cn_new` geändert werden. |
ALTER TABLE `tn` DROP COLUMN `cn`; | Mit diesem Befehl kann die Spalte `cn` mit sämtlichen enthaltenen Werten aus der Tabelle `tn` gelöscht werden. Eine Fremdschlüsselbeziehung, an welcher die Spalte `cn` beteiligt ist, kann verhindern, dass der Befehl ausgeführt wird. |
ALTER TABLE `tn` ADD CONSTRAINT `bed` CHECK (check-condition) [, ADD CONSTRAINT ...]; | Mit diesem Befehl können - abhängig von (check-condition) - für die Datensätze in der Tabelle `tn` die zulässigen Werte in einer Spalte weiter eingeschränkt werden, als es der für die Spalte vorgeschriebenen Datentyp fordert. Die Formulierung einer solchen Bedingung ist dann sinnvoll, wenn nicht alle Werte, welcher der festgelegte Datentyp für die Spalte zuässt, verwendet werden dürfen und sichergestellt werden soll, dass der Datenbank-Server nicht zugelassene Werte ablehnt.
Es kann mit (check-condition) auch für jeden Datensatz in der Tabelle `tn` eine bestimmte Relation zwischen den Werten aus zwei Spalten erzwungen werden. Die Prüffunktion von zac4web lässt pro CHECK-Anweisung innerhalb des ALTER-TABLE-Befehls jeweils nur einen Vergleich zu. Es dürfen aber innerhalb eines ALTER-TABLE-Befehls mehrere CHECK-Anweisungen erzeugt werden. Auch die Kombination mit FOREIGN-KEY-Anweisungen ist möglich. Dafür ist nur nach jeder CHECK- oder FOREIGN-KEY-Anweisung innerhalb des ALTER-TABLE-Befehls ein Komma zu notieren, hinter dem die ADD-CONSTRAINT-Anweisung folgt. |
ALTER TABLE `tn` DROP CHECK `bed`; | Falls die Bedingung `bed` die zugelassenen Werte für eine Tabelle zu stark eingeschränkt, kann die Bedingung mit diesem Befehl wieder entfernt werden. |
ALTER TABLE `tn` ADD [...] KEY [`ik`] (`cn`[,...] ) [USING ...] [, ADD ...]; | Mit diesem Befehl kann ein Index für eine Tabelle angelegt werden. Wird zwischen dem Wort ADD und dem Wort KEY das Wort PRIMARY notiert, entfällt die Angabe des Indexnamens `ik`. Wird zwischen ADD und KEY nur ein Leerzeichen oder das Wort UNIQUE notiert, muss der Indexnamen angegeben werden. In jedem Fall muss in den runden Klammern angegeben werden, aus welcher Spalte oder welchen Spalten die Werte stammen sollen, die als Indexwert verwendet werden sollen. Mit der optionalen Zeichenfolge "USING ..." kann die Speicherstruktur für den Index festgelegt werden. Die Prüffunktion akzeptiert dafür die Zeichenfolgen "USING BTREE" und "USING HASH". Pro ALTER-TABLE-Befehl können für die Tabelle `tn` beliebig viele Indizes erzeugt werden. Dafür ist nur jeweils ein Komma und eine weitere ADD-Anweisung anzuhängen. Pro Tabelle `tn` ist maximal ein PRIMARY KEY aber beliebig viele UNIQUE KEYs und einfache Indizes zulässig. Wenn in einer ALTER-TABLE-Befehl ein PRIMARY KEY erzeugt werden soll, muss die ADD-Anweisung für diesen Index für die Prüffunktion von zac4web als erstes auf den Tabellennamen `tn` folgen. Danach sind dann die ADD-Anweisungen für die UNIQUE KEYs zu notieren und als letzes die ADD-Anweisungen für die einfachen Indizes. |
ALTER TABLE `tn` DROP KEY `ik`; | Mit diesem Befehl können einfache und eindeutige (= UNIQUE) Indizes für eine Tabelle gelöscht werden, aber nicht der Primärschlüssel. Für das Löschen von letzterem gibt es einen eigenständigen Befehl, da das Schlüsselwort "PRIMARY" dem Indexnamen entspricht. |
ALTER TABLE `tn` DROP PRIMARY KEY; | Mit diesem Befehl kann der Primärschlüssel für eine Tabelle gelöscht werden. Gilt für die Spalte, welche zuvor als Primärschlüsselspalte deklariert wurde, "AUTO_INCREMENT", kann der Primärschlüssel erst gelöscht werden, wenn für die Spalte mit dem Befehl "ALTER TABLE `tn` MODIFY COLUMN ..." die Eigenschaft "AUTO_INCREMENT" entfernt wurde, indem sie bei der neuen coldefinition nicht aufgeführt wird. |
ALTER TABLE `tn_1` ADD CONSTRAINT `kf` FOREIGN KEY (`cn_z1`[, ...]) REFERENCES `tn_2` (`cn_q1`[, ...]) [, ADD CONSTRAINT ...]; | Dieser Befehl ist erforderlich, um Datensätze aus verschiedenen Datenbanktabellen miteinander zu verknüpfen. Mit diesem Befehl wird festgelegt, dass es zu jedem Datensatz in der Tabelle `tn_1` mit dem Wert 'xyz' in der Spalte `cn_z1` (genau einen oder keinen bzw. beliebig viele oder keinen) Datensatz/Datensätze in der Tabelle Tabelle `tn_2` geben muss, der/die in der Spalte `tn_2` ebenfalls den Wert 'xyz' besitzen. "Keinen" ist nur dann möglich, wenn für die Spalte `cn_z1` der NULL-Wert zugelassen ist. Genau einen gilt dann, wenn der Index für die Spalte `cn_q1` ein eindeutiger Index (UNIQUE KEY oder PRIMARY KEY) ist. Soll eine Wertekombination aus mehreren Spalten für die Beziehung verwendet werden, sollte zuvor für beide Tabellen der jeweilige Index für die Spaltenkombination angelegt worden sein. Für die Beziehnung sind in den beiden runden Klammern die Spaltennamen in der Reihenfolge zu notieren, wie die Wertekombination gebildet werden soll. Zwischen den Spaltennamen ist dann jeweils ein Komma als Leerzeichen zu setzen. In beiden runden Klammern muss die gleiche Anzahl an Spaltennamen vorhanden sein. Es dürfen innerhalb eines ALTER-TABLE-Befehls mehrere FOREIGN-KEY-Anweisungen erzeugt werden. Auch die Kombination mit CHECK-Anweisungen ist möglich. Dafür ist nur nach jeder FOREIGN-KEY- oder CHECK-Anweisung innerhalb des ALTER-TABLE-Befehls ein Komma zu notieren, hinter dem die ADD-CONSTRAINT-Anweisung folgt. |
ALTER TABLE `tn` DROP FOREIGN KEY `fk`; | Mit diesem Befehl wird die Fremdschlüsselbeziehung `fk` gelöscht. Das Löschen kann z.B. erforderlich sein, damit für verknüpfte Spalten die Spaltendefinition verändert oder eine der beiden an der Beziehung beteiligten Tabellen geleert oder gelöscht werden kann. |
© zacher-info.de
- Seite zuletzt geändert: 04.06.2025 - Elisabeth Zacher