CREATE [TEMPORARY] TABLE [IF NOT EXISTS]tbl_name
[(create_definition
,...)] [table_options
] [select_statement
]
Oder:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS]tbl_name
[(] LIKEold_tbl_name
[)];create_definition
:column_definition
| [CONSTRAINT [symbol
]] PRIMARY KEY [index_type
] (index_col_name
,...) | KEY [index_name
] [index_type
] (index_col_name
,...) | INDEX [index_name
] [index_type
] (index_col_name
,...) | [CONSTRAINT [symbol
]] UNIQUE [INDEX] [index_name
] [index_type
] (index_col_name
,...) | FULLTEXT [INDEX] [index_name
] (index_col_name
,...) [WITH PARSERparser_name
] | SPATIAL [INDEX] [index_name
] (index_col_name
,...) | [CONSTRAINT [symbol
]] FOREIGN KEY [index_name
] (index_col_name
,...) [reference_definition
] | CHECK (expr
)column_definition
:col_name
type
[NOT NULL | NULL] [DEFAULTdefault_value
] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string
'] [reference_definition
]type
: TINYINT[(length
)] [UNSIGNED] [ZEROFILL] | SMALLINT[(length
)] [UNSIGNED] [ZEROFILL] | MEDIUMINT[(length
)] [UNSIGNED] [ZEROFILL] | INT[(length
)] [UNSIGNED] [ZEROFILL] | INTEGER[(length
)] [UNSIGNED] [ZEROFILL] | BIGINT[(length
)] [UNSIGNED] [ZEROFILL] | REAL[(length
,decimals
)] [UNSIGNED] [ZEROFILL] | DOUBLE[(length
,decimals
)] [UNSIGNED] [ZEROFILL] | FLOAT[(length
,decimals
)] [UNSIGNED] [ZEROFILL] | DECIMAL(length
,decimals
) [UNSIGNED] [ZEROFILL] | NUMERIC(length
,decimals
) [UNSIGNED] [ZEROFILL] | DATE | TIME | TIMESTAMP | DATETIME | YEAR | CHAR(length
) [BINARY | ASCII | UNICODE] | VARCHAR(length
) [BINARY] | BINARY(length
) | VARBINARY(length
) | TINYBLOB | BLOB | MEDIUMBLOB | LONGBLOB | TINYTEXT [BINARY] | TEXT [BINARY] | MEDIUMTEXT [BINARY] | LONGTEXT [BINARY] | ENUM(value1
,value2
,value3
,...) | SET(value1
,value2
,value3
,...) |spatial_type
index_col_name
:col_name
[(length
)] [ASC | DESC]reference_definition
: REFERENCEStbl_name
[(index_col_name
,...)] [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE] [ON DELETEreference_option
] [ON UPDATEreference_option
]reference_option
: RESTRICT | CASCADE | SET NULL | NO ACTIONtable_options
:table_option
[table_option
] ...table_option
: {ENGINE|TYPE} [=]engine_name
| AUTO_INCREMENT [=]value
| AVG_ROW_LENGTH [=]value
| [DEFAULT] CHARACTER SETcharset_name
[COLLATEcollation_name
] | CHECKSUM [=] {0 | 1} | COMMENT [=] 'string
' | CONNECTION [=] 'connect_string
' | MAX_ROWS [=]value
| MIN_ROWS [=]value
| PACK_KEYS [=] {0 | 1 | DEFAULT} | PASSWORD [=] 'string
' | DELAY_KEY_WRITE [=] {0 | 1} | ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT} | UNION [=] (tbl_name
[,tbl_name
]...) | INSERT_METHOD [=] { NO | FIRST | LAST } | DATA DIRECTORY [=] 'absolute path to directory
' | INDEX DIRECTORY [=] 'absolute path to directory
'partition_options
: PARTITION BY [LINEAR] HASH(expr
) | [LINEAR] KEY(column_list
) | RANGE(expr
) | LIST(expr
) [PARTITIONSnum
] [ SUBPARTITION BY [LINEAR] HASH(expr
) | [LINEAR] KEY(column_list
) [SUBPARTITIONSnum
] ] [(partition_definition
) [, (partition_definition
)] ...]partition_definition
: PARTITIONpartition_name
[VALUES {LESS THAN (expr
) |MAXVALUE
| IN (value_list
)}] [[STORAGE] ENGINE [=]engine-name
] [COMMENT [=]'comment_text'
] [DATA DIRECTORY [=] ''] [INDEX DIRECTORY [=] '
data_dir
'] [MAX_ROWS [=]
index_dir
max_number_of_rows
] [MIN_ROWS [=]min_number_of_rows
] [TABLESPACE [=] (tablespace_name
)] [NODEGROUP [=]node_group_id
] [(subpartition_definition
) [, (subpartition_definition
)] ...]subpartition_definition
: SUBPARTITIONlogical_name
[[STORAGE] ENGINE [=]engine-name
] [COMMENT [=]'comment_text'
] [DATA DIRECTORY [=] ''] [INDEX DIRECTORY [=] '
data_dir
'] [MAX_ROWS [=]
index_dir
max_number_of_rows
] [MIN_ROWS [=]min_number_of_rows
] [TABLESPACE [=] (tablespace_name
)] [NODEGROUP [=]node_group_id
]select_statement:
[IGNORE | REPLACE] [AS] SELECT ... (Some legal select statement
)
CREATE TABLE
erstellt eine Tabelle des
angegebenen Namens. Für die Tabelle benötigen Sie die
Berechtigung CREATE
.
Die Regeln für zulässige Tabellennamen sind in Abschnitt 9.2, „Datenbank-, Tabellen-, Index-, Spalten- und Aliasnamen“, beschrieben. Standardmäßig wird die Tabelle in der Standarddatenbank erstellt. Wenn die Tabelle bereits vorhanden ist oder weder die Standarddatenbank noch die angegebene Datenbank vorhanden sind, wird ein Fehler erstellt.
Der Tabellenname kann als
db_name.tbl_name
angegeben werden, um
die Tabelle in einer bestimmten Datenbank zu erstellen. Das
funktioniert unabhängig vom Vorhandensein einer
Standarddatenbank, sofern die angegebene Datenbank vorhanden
ist. Wenn Sie Bezeichner in Anführungszeichen verwenden, setzen
Sie Datenbank- und Tabellennamen separat in Anführungszeichen.
So ist etwa `mydb`.`mytbl`
zulässig –
anders als `mydb.mytbl`
.
Sie können das Schlüsselwort TEMPORARY
bei
der Erstellung einer Tabelle verwenden. Eine
TEMPORARY
-Tabelle ist nur für die aktuelle
Verbindung sichtbar und wird beim Beenden dieser Verbindung
automatisch gelöscht. Das bedeutet, dass zwei verschiedene
Verbindungen Temporärtabellen desselben Namens verwenden
können, ohne dass es zu Konflikten mit der jeweils anderen
Tabelle oder einer nichttemporären Tabelle gleichen Namens
kommt. (Die vorhandene Tabelle wird verborgen, bis die
Temporärtabelle gelöscht wird.) Zur Erstellung von
Temporärtabellen benötigen Sie die Berechtigung
CREATE TEMPORARY TABLES
.
Die Schlüsselwörter IF NOT EXISTS
verhindern, dass ein Fehler auftritt, wenn die Tabelle vorhanden
ist. Allerdings wird nicht überprüft, ob die vorhandene
Tabelle die gleiche Struktur wie die in der CREATE
TABLE
-Anweisung angegebene Tabelle hat.
Hinweis: Wenn Sie IF NOT
EXISTS
in einer CREATE TABLE ...
SELECT
-Anweisung verwenden, werden alle durch den
SELECT
-Teil gewählten Datensätze ohne
Berücksichtigung der Frage eingefügt, ob die Tabelle bereits
vorhanden ist.
MySQL stellt jede Tabelle durch eine
.frm
-Tabellenformatdatei (Definitionsdatei)
im Datenbankverzeichnis dar. Die Speicher-Engine der Tabelle
erstellt unter Umständen auch andere Dateien. Im Falle von
MyISAM
-Tabellen erstellt die Speicher-Engine
Daten- und Indexdateien. Es gibt also für jede
MyISAM
-Tabelle
tbl_name
drei Dateien auf der
Festplatte:
Datei | Zweck |
|
Tabellenformatdatei (Definitionsdatei) |
|
Datendatei |
|
Indexdatei |
Kapitel 14, Speicher-Engines und Tabellentypen, beschreibt, welche Dateien die einzelnen Speicher-Engines zur Darstellung von Tabellen erstellen.
type
stellt den Datentyp einer
Spaltendefinition dar. spatial_type
ist ein
raumbezogener Datentyp. Allgemeine Informationen zu den
Eigenschaften von Datentypen (außer raumbezogenen Datentypen)
finden Sie in Kapitel 11, Datentypen. Informationen zu
raumbezogenen Datentypen finden Sie in
Kapitel 18, Raumbezogene Erweiterungen in MySQL.
Wenn weder NULL
noch NOT
NULL
angegeben sind, wird die Spalte so behandelt,
als ob NULL
angegeben worden wäre.
Eine Integer-Spalte kann das Zusatzattribut
AUTO_INCREMENT
erhalten. Wenn Sie den
Wert NULL
(empfohlen) oder
0
in eine indizierte
AUTO_INCREMENT
-Spalte einfügen, wird die
Spalte auf den nächsten Sequenzwert gesetzt. Normalerweise
ist dies
, wobei
value
+1value
der derzeit größte Wert
der Spalte in der Tabelle ist.
AUTO_INCREMENT
-Sequenzen beginnen bei
1
.
Um einen AUTO_INCREMENT
-Wert nach
Einfügen eines Datensatzes abzurufen, verwenden Sie die
SQL-Funktion LAST_INSERT_ID()
oder die
C-API-Funktion mysql_insert_id()
. Siehe
auch Abschnitt 12.10.3, „Informationsfunktionen“, und
Abschnitt 24.2.3.36, „mysql_insert_id()
“.
Wenn der SQL-Modus NO_AUTO_VALUE_ON_ZERO
aktiviert ist, können Sie 0
in
AUTO_INCREMENT
-Spalten als
0
speichern, ohne einen neuen Sequenzwert
zu erzeugen. Siehe auch Abschnitt 5.2.5, „Der SQL-Modus des Servers“.
Hinweis: Es kann nur eine
AUTO_INCREMENT
-Spalte pro Tabelle geben.
Diese muss indiziert sein und darf keinen Standardwert
haben. Eine AUTO_INCREMENT
-Spalte
funktioniert nur dann einwandfrei, wenn sie ausschließlich
positive Werte enthält. Das Einfügen eines negativen Werts
wird als Einfügen einer sehr großen positiven Zahl
aufgefasst. Dies wird gemacht, um genauigkeitsspezifische
Probleme zu vermeiden, die beim „Umklappen“ von
positiven auf negative Zahlen auftreten können, und um zu
gewährleisten, dass Sie nicht versehentlich eine
AUTO_INCREMENT
-Spalte erhalten, die
0
enthält.
Bei MyISAM
- und
BDB
-Tabellen können Sie
AUTO_INCREMENT
in einer Sekundärspalte
eines mehrspaltigen Schlüssels angeben. Siehe auch
Abschnitt 3.6.9, „Verwendung von AUTO_INCREMENT
“.
Um MySQL mit einigen ODBC-Anwendungen kompatibel zu machen,
können Sie den AUTO_INCREMENT
-Wert für
den letzten eingefügten Datensatz mit der folgenden Abfrage
ermitteln:
SELECT * FROMtbl_name
WHEREauto_col
IS NULL
Das Attribut SERIAL
kann als Alias für
BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
UNIQUE
verwendet werden.
Zeichendatentypen (CHAR
,
VARCHAR
, TEXT
) können
CHARACTER SET
- und
COLLATE
-Attribute zur Angabe von
Zeichensatz und Sortierfolge der Spalte enthalten. Weitere
Informationen finden Sie in Kapitel 10, Zeichensatz-Unterstützung.
CHARSET
ist ein Synonym für
CHARACTER SET
. Beispiel:
CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
MySQL 5.1 interpretiert Längenangaben in Zeichenspaltendefinitionen als Anzahl von Zeichen. (Versionen vor MySQL 4.1 interpretierten sie als Anzahl von Bytes.)
Die DEFAULT
-Klausel gibt einen
Vorgabewert für eine Spalte an. Mit einer Ausnahme muss der
Vorgabewert immer eine Konstante sein. Funktionen oder
Ausdrücke sind als Vorgabe nicht zulässig. Das bedeutet,
dass Sie beispielsweise als Vorgabewert einer Datumsspalte
nicht den Wert einer Funktion wie NOW()
oder CURRENT_DATE
angeben dürfen. Die
genannte Ausnahme besteht darin, dass Sie
CURRENT_TIMESTAMP
als Vorgabe für eine
TIMESTAMP
-Spalte festlegen können. Siehe
auch Abschnitt 11.3.1.1, „TIMESTAMP
-Eigenschaften ab MySQL 4.1“.
Wenn eine Spaltendefinition keinen expliziten
DEFAULT
-Wert enthält, bestimmt MySQL
diesen wie in Abschnitt 11.1.4, „Vorgabewerte von Datentypen“,
beschrieben.
Für BLOB
- und
TEXT
-Spalten können keine Vorgaben
festgelegt werden.
Ein Kommentar für eine Spalte kann mit der Option
COMMENT
angegeben werden. Der Kommentar
wird über die Anweisungen SHOW CREATE
TABLE
und SHOW FULL COLUMNS
angezeigt.
KEY
ist normalerweise ein Synonym für
INDEX
. Das Schlüsselattribut
PRIMARY KEY
kann auch einfach als
KEY
angegeben werden, sofern die Angabe
in einer Spaltendefinition erfolgt. Dieses Verhalten wurde
aus Gründen der Kompatibilität mit anderen
Datenbanksystemen implementiert.
Ein eindeutiger Index ist dahingehend eingeschränkt, dass
alle Werte im Index eindeutig sein müssen. Wenn Sie einen
neuen Datensatz mit einem Schlüssel hinzufügen, der dem
eines vorhandenen Datensatzes entspricht, tritt ein Fehler
auf. Eine Ausnahme hierzu besteht darin, dass, wenn eine
Spalte im Index NULL
-Werte enthalten
darf, diese mehrere NULL
-Werte enthalten
kann. Diese Ausnahme gilt jedoch nicht für
BDB
-Tabellen, bei denen eine Spalte mit
einem eindeutigen Index NULL
nur einmalig
gestattet.
Ein Primärschlüssel ist ein eindeutiger Index, bei dem
alle Schlüsselspalten als NOT NULL
definiert sein müssen. Wenn sie nicht explizit als
NOT NULL
deklariert sind, holt MySQL dies
implizit (und stillschweigend) nach. Eine Tabelle darf nur
einen Primärschlüssel enthalten. Wenn Sie keinen
Primärschlüssel haben und eine Anwendung nach dem
Primärschlüssel in Ihren Tabellen fragt, gibt MySQL als
Primärschlüssel den ersten eindeutigen Index zurück, der
keine NULL
-Spalten verwendet.
In der erstellten Tabelle wird der Primärschlüssel an die
erste Position gesetzt, gefolgt von allen eindeutigen
Indizes und nachfolgend den nichteindeutigen Indizes. Dies
erleichtert dem MySQL-Optimierer die Priorisierung der zu
verwendenden Indizes und die schnelle Erkennung von
Dubletten bei den UNIQUE
-Schlüsseln.
Ein Primärschlüssel kann ein mehrspaltiger Index sein. Sie
können allerdings keinen mehrspaltigen Index mithilfe des
Schlüsselattributs PRIMARY KEY
in einer
Spaltendefinition erstellen. Wenn Sie dies tun, wird nur
diese eine Spalte als Primärschlüssel gekennzeichnet. Sie
müssen hierzu eine separate PRIMARY
KEY(index_col_name, ...)
-Klausel verwenden.
Wenn ein Primärschlüssel oder ein eindeutiger Index aus
nur einer Spalte eines Integer-Typs bestehen, können Sie
die Spalte auch in SELECT
-Anweisungen als
_rowid
referenzieren.
In MySQL lautet der Name eines Primärschlüssels
PRIMARY
. Bei anderen Indizes erhält,
sofern Sie keinen Namen angeben, der Index jeweils denselben
Namen wie die erste indizierte Spalte. Es kann optional ein
Suffix (_2
, _3
,
...
) angegeben werden, um den Index
eindeutig zu machen. Sie können die Indexnamen für eine
Tabelle mit SHOW INDEX FROM
anzeigen.
Siehe auch Abschnitt 13.5.4.12, „tbl_name
SHOW INDEX
“.
Einige Speicher-Engines gestatten bei der Erstellung eines
Indexes die Angabe eines Indextyps. Die Syntax für die
Konfigurationsangabe index_type
lautet USING
.
type_name
Beispiel:
CREATE TABLE lookup (id INT, INDEX USING BTREE (id)) ENGINE = MEMORY;
Detaillierte Informationen zu USING
finden Sie in Abschnitt 13.1.4, „CREATE INDEX
“.
Weitere Informationen dazu, wie MySQL Indizes verwendet, finden Sie in Abschnitt 7.4.5, „Wie MySQL Indizes benutzt“.
In MySQL 5.1 unterstützen nur die
Speicher-Engines MyISAM
,
InnoDB
, BDB
und
MEMORY
Indizes bei Spalten, die
NULL
-Werte enthalten. In anderen Fällen
müssen Sie indizierte Spalten als NOT
NULL
deklarieren, andernfalls wird ein Fehler
zurückgegeben.
Mit der Syntax
in einer Indexdefinition können Sie einen Index erstellen,
der die Spalte nur teilweise verwendet. Indexeinträge
umfassen die ersten col_name
(length
)length
Zeichen jedes Spaltenwerts bei CHAR
- und
VARCHAR
-Spalten sowie die ersten
length
Bytes jedes Spaltenwerts
bei BINARY
- und
VARBINARY
-Spalten. Wenn Sie auf diese
Weise nur ein Präfix der Spaltenwerte indizieren, kann dies
die Indexdatei erheblich kleiner machen. Siehe auch
Abschnitt 7.4.3, „Spaltenindizes“.
Die Speicher-Engines MyISAM
,
BDB
und InnoDB
unterstützen die Indizierung von BLOB
-
und TEXT
-Spalten. Bei der Indizierung
einer BLOB
- oder
TEXT
-Spalte müssen
Sie eine Präfixlänge für den Index angeben. Zum Beispiel:
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
Präfixe können bis 1.000 Byte lang sein (767 Byte bei
InnoDB
-Tabellen). Beachten Sie, dass
Präfixbeschränkungen in Byte angegeben werden, wohingegen
die Präfixlänge in CREATE
TABLE
-Anweisungen bei nichtbinären Datentypen
(CHAR
, VARCHAR
,
TEXT
) als Anzahl der Zeichen
interpretiert wird. Dies muss bei der Angabe einer
Präfixlänge für eine Spalte berücksichtigt werden, die
einen Multibytezeichensatz verwendet.
Eine index_col_name
-Definition
kann auf ASC
oder DESC
enden. Diese Schlüsselwörter sind für zukünftige
Erweiterungen zulässig, um eine Speicherung der Indexwerte
in auf- oder absteigender Reihenfolge festzulegen. Zurzeit
werden sie zwar erkannt, aber ignoriert – Indexwerte
werden immer in aufsteigender Reihenfolge gespeichert.
Wenn Sie ORDER BY
oder GROUP
BY
für eine TEXT
- oder
BLOB
-Spalte in einer
SELECT
-Anweisung verwenden, sortiert der
Server Werte lediglich unter Verwendung der ersten Bytes.
Wie viele Bytes dies sind, wird von der Systemvariablen
max_sort_length
angegeben. Siehe auch
Abschnitt 11.4.3, „Die Spaltentypen BLOB
und TEXT
“.
Sie können spezielle Volltextindizes erstellen, die für
die Volltextsuche verwendet werden. Nur die
MyISAM
-Speicher-Engine unterstützt
Volltextindizes. Diese können nur aus
CHAR
-, VARCHAR
- und
TEXT
-Spalten erstellt werden. Die
Indizierung erfolgt immer über die gesamte Spalte: Eine
Teilindizierung wird nicht unterstützt, und ein eventuell
angegebenes Präfix wird ignoriert. Weitere Informationen
finden Sie in Abschnitt 12.7, „MySQL-Volltextsuche“. Eine
WITH PARSER
-Klausel kann angegeben
werden, um ein Parser-Plug-In mit dem Index zu verknüpfen,
wenn Volltextindizierungs- und Suchoperationen besondere
Maßnahmen erfordern. Diese Klausel ist nur für
FULLTEXT
-Indizes zulässig. Informationen
zur Erstellung von Plug-Ins finden Sie in
Abschnitt 26.2, „Die MySQL-Plug-In-Schnittstelle“.
SPATIAL
-Indizes können Sie für
raumbezogene Typen erstellen. Solche Typen werden nur für
MyISAM
-Tabellen unterstützt, und
indizierte Spalten müssen als NOT NULL
deklariert sein. Siehe auch
Kapitel 18, Raumbezogene Erweiterungen in MySQL.
InnoDB
-Tabellen unterstützen die
Überprüfung von Fremdschlüssel-Constraints. Siehe auch
Abschnitt 14.2, „InnoDB
-Tabellen“. Beachten Sie, dass die
Fremdschlüsselsyntax in InnoDB
restriktiver ist als die zu Beginn dieses Abschnitts für
die CREATE TABLE
-Anweisung präsentierte
Syntax: Die Spalten der referenzierten Tabellen müssen
immer explizit genannt werden. InnoDB
unterstützt sowohl ON DELETE
- als auch
ON UPDATE
-Aktionen für Fremdschlüssel.
Informationen zur exakten Syntax finden Sie in
Abschnitt 14.2.6.4, „Fremdschlüssel-Beschränkungen“.
Bei anderen Speicher-Engines erkennt MySQL Server die
FOREIGN KEY
- und
REFERENCES
-Syntax in CREATE
TABLE
-Anweisungen, ignoriert sie aber. Zudem wird
die Klausel CHECK
von allen
Speicher-Engines erkannt, aber ignoriert. Siehe auch
Abschnitt 1.9.5.5, „Fremdschlüssel“.
Bei MyISAM
-Tabellen benötigt jede
NULL
-Spalte ein zusätzliches Bit,
aufgerundet auf das nächste Byte. Die maximale
Datensatzlänge in Byte kann wie folgt berechnet werden:
row length = 1 + (sum of column lengths
) + (number of NULL columns
+delete_flag
+ 7)/8 + (number of variable-length columns
)
delete_flag
ist 1 bei Tabellen
mit statischem Datensatzformat. Statische Tabellen verwenden
ein Bit im Datensatz für ein Flag, das angibt, ob der
Datensatz gelöscht wurde.
delete_flag
ist 0 bei dynamischen
Tabellen, weil das Flag im dynamischen Datensatz-Header
gespeichert wird.
Diese Berechnungen gelten nicht für
InnoDB
-Tabellen, bei denen der
Speicherbedarf von NULL
-Spalten sich
nicht von dem von NOT NULL
-Spalten
unterscheidet.
Die Tabellenoption ENGINE
gibt die
Speicher-Engine für die Tabelle an. TYPE
ist
ein Synonym hierzu, wobei ENGINE
der
bevorzugte Name ist.
Die Tabellenoption ENGINE
akzeptiert die in
der folgenden Tabelle aufgeführten Namen für Speicher-Engines.
Speicher-Engine | Beschreibung |
ARCHIVE |
Speicher-Engine zur Archivierung. Siehe auch
Abschnitt 14.8, „Die ARCHIVE -Speicher-Engine“. |
BDB |
Transaktionssichere Tabellen mit Seitensperrung. Heißt auch
BerkeleyDB . Siehe auch
Abschnitt 14.5, „Die BDB -Speicher-Engine“. |
CSV |
Tabellen, die Datensätze als kommagetrennte Werte speichern. Siehe auch
Abschnitt 14.9, „Die CSV -Speicher-Engine“. |
EXAMPLE |
Eine Beispiel-Engine. Siehe auch
Abschnitt 14.6, „Die EXAMPLE -Speicher-Engine“. |
FEDERATED |
Speicher-Engine, die auf entfernte Tabellen zugreift. Siehe auch
Abschnitt 14.7, „Die FEDERATED -Speicher-Engine“. |
HEAP |
Ein Synonym für MEMORY . |
ISAM (VERALTET) |
In MySQL 5.1 nicht verfügbar. Wenn Sie von einer älteren
Version auf MySQL 5.1 aktualisieren,
sollten Sie alle vorhandenen
ISAM -Tabellen in
MyISAM -Tabellen konvertieren,
bevor Sie das Upgrade durchführen. |
InnoDB |
Transaktionssichere Tabellen mit Datensatzsperrung und Fremdschlüsseln.
Siehe auch Abschnitt 14.2, „InnoDB -Tabellen“. |
MEMORY |
Die Daten für diese Speicher-Engine werden nur im Speicher abgelegt.
Siehe auch Abschnitt 14.4, „Die MEMORY -Speicher-Engine“. |
MERGE |
Eine Sammlung von MyISAM -Tabellen, die als eine
Tabelle verwendet wird. Heißt auch
MRG_MyISAM . Siehe auch
Abschnitt 14.3, „Die MERGE -Speicher-Engine“. |
MyISAM |
Binäre portable Speicher-Engine, die als Standard-Engine in MySQL
verwendet wird. Siehe auch
Abschnitt 14.1, „Die MyISAM -Speicher-Engine“. |
NDBCLUSTER |
Fehlertolerante, speicherbasierte Cluster-Tabellen. Heißt auch
NDB . Siehe auch
Kapitel 16, MySQL Cluster. |
Wird eine Speicher-Engine angegeben, die nicht verfügbar ist,
dann verwendet MySQL stattdessen die Standard-Engine. Im
Normalfall ist dies MyISAM
. Wenn
beispielsweise eine Tabellendefinition die Option
ENGINE=BDB
enthält, aber der MySQL Server
BDB
-Tabellen nicht unterstützt, dann wird
die Tabelle als MyISAM
-Tabelle erstellt. Auf
diese Weise ist eine Replikationskonfiguration realisierbar, bei
der Sie transaktionssichere Tabellen auf dem Master haben,
während die auf dem Slave erstellten Tabellen nicht
transaktionssicher sind (was eine Erhöhung der
Verarbeitungsgeschwindigkeit nach sich zieht). In MySQL
5.1 erscheint eine Warnung, wenn die Spezifikation
der Speicher-Engine nicht berücksichtigt werden kann.
Die übrigen Tabellenoptionen werden zur Optimierung des Verhaltens der Tabelle verwendet. In den meisten Fällen müssen Sie sie überhaupt nicht angeben. Diese Optionen gelten für alle Speicher-Engines, soweit nichts anderes angegeben ist:
AUTO_INCREMENT
Der AUTO_INCREMENT
-Startwert für die
Tabelle. In MySQL 5.1 funktioniert dies bei
MyISAM
-, MEMORY
- und
InnoDB
-Tabellen. Um den ersten
AUTO_INCREMENT
-Wert für Engines zu
setzen, die die Tabellenoption
AUTO_INCREMENT
nicht unterstützen,
fügen Sie einen „Pseudodatensatz“ mit einem
Wert ein, der um 1 niedriger ist als der gewünschte
Startwert. Nach der Erstellung der Tabelle löschen Sie den
Pseudodatensatz dann.
Bei Engines, die die Tabellenoption
AUTO_INCREMENT
in CREATE
TABLE
-Anweisungen unterstützen, können Sie auch
ALTER TABLE
verwenden, um den tbl_name
AUTO_INCREMENT = N
AUTO_INCREMENT
-Wert
zurückzusetzen.
AVG_ROW_LENGTH
Ein Näherungswert für die durchschnittliche Datensatzlänge in Ihrer Tabelle. Sie müssen die Einstellung nur bei großen Tabellen mit Datensätzen unterschiedlicher Größe vornehmen.
Wenn Sie eine MyISAM
-Tabelle erstellen,
verwendet MySQL das Produkt der Optionen
MAX_ROWS
und
AVG_ROW_LENGTH
, um zu ermitteln, wie
groß die resultierende Tabelle sein wird. Geben Sie keine
der Optionen an, dann beträgt die maximale Tabellengröße
65.536 Tbyte Daten. (Wenn Ihr Betriebssystem derart große
Dateien nicht unterstützt, wird die maximale Größe einer
Tabelle durch die betriebssystemseitige Beschränkung der
Dateigröße bestimmt.) Wenn Sie die Zeigergrößen gering
halten wollen, damit der Index kleiner und schneller wird,
und Sie eigentlich keine großen Dateien benötigen, können
Sie die Standardzeigergröße durch Einstellen der
Systemvariablen myisam_data_pointer_size
verringern. (Siehe auch
Abschnitt 5.2.2, „Server-Systemvariablen“.) Wenn Sie wollen,
dass alle Ihre Tabellen über das standardmäßige Limit
hinaus anwachsen können, und dafür in Kauf nehmen, dass
die Tabellen etwas größer und langsamer sind als
notwendig, dann können Sie die Standardzeigergröße durch
Einstellen der Variablen auch erhöhen.
[DEFAULT] CHARACTER SET
Gibt einen Standardzeichensatz für die Tabelle an.
CHARSET
ist ein Synonym für
CHARACTER SET
.
COLLATE
Gibt eine Standardsortierfolge für die Tabelle an.
CHECKSUM
Setzen Sie diese Option auf 1, wenn Sie wollen, dass MySQL
eine Prüfsumme für alle Datensätze erstellt, die zudem
bei Änderungen in der Tabelle automatisch aktualisiert
wird. Dies macht die Aktualisierung der Tabelle zwar ein
wenig langsamer, erleichtert aber das Auffinden
beschädigter Tabellen. Die Anweisung CHECKSUM
TABLE
meldet die Prüfsumme. (Nur für
MyISAM
.)
COMMENT
Ein Kommentar für die Tabelle, der bis zu 60 Zeichen lang sein kann.
CONNECTION
Der Verbindungs-String für eine
FEDERATED
-Tabelle.
(Hinweis: Ältere Versionen
von MySQL verwendeten eine Option COMMENT
für den Verbindungs-String.)
MAX_ROWS
Maximale Anzahl der Datensätze, die Sie in der Tabelle zu speichern beabsichtigen. Dies ist keine feste Beschränkung, sondern ein Indikator für die Anzahl der Datensätze, die die Tabelle zumindest speichern können muss.
MIN_ROWS
Minimale Anzahl der Datensätze, die Sie in der Tabelle zu speichern beabsichtigen.
PACK_KEYS
Setzen Sie diese Option auf 1, wenn Sie kleinere Indizes
wünschen. Hierdurch werden Updates in der Regel langsamer
und Leseoperationen schneller. Wenn Sie die Option auf 0
setzen, wird das Packen für alle Schlüssel deaktiviert.
Setzen Sie sie hingegen auf DEFAULT
, dann
wird die Speicher-Engine angewiesen, nur lange
CHAR
- und
VARCHAR
-Spalten zu packen. (Nur für
MyISAM
.)
Wenn Sie PACK_KEYS
nicht verwenden,
werden standardmäßig Strings, aber nicht Zahlen gepackt.
Bei PACK_KEYS=1
werden auch Zahlen
gepackt.
Beim Packen von binären Zahlenschlüsseln verwendet MySQL die Präfixkompression:
Jeder Schlüssel benötigt ein zusätzliches Byte, um anzugeben, wie viele Bytes des vorherigen Schlüssels beim nachfolgenden Schlüssel identisch sind.
Der Zeiger auf den Datensatz wird direkt auf den Schlüssel folgend und in absteigender Reihenfolge der Bytewertigkeit gespeichert, um die Komprimierung zu optimieren.
Das bedeutet, dass, wenn Sie viele gleiche Schlüssel in
zwei aufeinander folgenden Datensätzen haben, alle
nachfolgenden „identischen“ Schlüssel
einschließlich des Zeigers auf den Datensatz nur 2 Byte
benötigen. Vergleichen Sie dies einmal mit dem normalen
Fall, in dem die nachfolgenden Schlüssel
storage_size_for_key + pointer_size
Bytes
benötigen (wobei die Zeigergröße normalerweise 4
beträgt). Umgekehrt können Sie nur dann umfassend von der
Präfixkomprimierung profitieren, wenn Sie viele identische
Zahlen haben. Wenn alle Schlüssel vollständig
unterschiedlich sind, verwenden Sie pro Schlüssel ein Byte
mehr, wenn der jeweilige Schlüssel keine
NULL
-Werte haben kann. (In diesem Fall
wird die Länge des gepackten Schlüssels im selben Byte
gespeichert, das zur Kennzeichnung verwendet wird, wenn ein
Schlüssel NULL
ist.)
PASSWORD
Verschlüsselt die .frm
-Datei mit einem
Passwort. In der MySQL-Standardversion tut die Option
nichts.
DELAY_KEY_WRITE
Setzen Sie diese Option auf 1, wenn Sie Schlüssel-Updates
für die Tabelle auf einen Zeitpunkt verschieben wollen, an
dem die Tabelle geschlossen ist. Details finden Sie in der
Beschreibung zur Systemvariablen
delay_key_write
in
Abschnitt 5.2.2, „Server-Systemvariablen“. (Nur für
MyISAM
.)
ROW_FORMAT
Definiert, wie die Datensätze gespeichert werden sollen.
Bei MyISAM
-Tabellen kann der Optionswert
FIXED
oder DYNAMIC
für das statische wie auch das variabel lange
Datensatzformat sein. myisampack setzt
den Typ auf COMPRESSED
. Siehe auch
Abschnitt 14.1.3, „MyISAM-Tabellenformate“.
Bei InnoDB
-Tabellen werden die
Datensätze standardmäßig im kompakten Format
(ROW_FORMAT=COMPACT
) gespeichert. Das
nichtkompakte Format, welches in älteren MySQL-Versionen
verwendet wurde, kann noch über die Angabe von
ROW_FORMAT=REDUNDANT
angefordert werden.
RAID_TYPE
Die RAID
-Unterstützung wurde ab MySQL
5.0 entfernt. Informationen zu RAID
finden Sie online im MySQL-4.1-Handbuch unter
http://dev.mysql.com/doc/refman/4.1/en/create-table.html.
UNION
UNION
wird verwendet, wenn Sie auf eine
ganze Sammlung identischer
MyISAM
-Tabellen zugreifen wollen. Dies
funktioniert nur bei MERGE
-Tabellen.
Siehe auch Abschnitt 14.3, „Die MERGE
-Speicher-Engine“.
Sie benötigen die Berechtigungen SELECT
,
UPDATE
und DELETE
für
die Tabellen, um die Sammlung einer MERGE
zuordnen zu können. (Hinweis:
Ursprünglich mussten alle verwendeten Tabellen sich in der
gleichen Datenbank wie die MERGE
-Tabelle
selbst befinden. Diese Einschränkung trifft nicht mehr zu.)
INSERT_METHOD
Wenn Sie Daten in eine MERGE
-Tabelle
einfügen wollen, müssen Sie mit
INSERT_METHOD
die Tabelle festlegen, in
die der Datensatz einzufügen ist. Die Option
INSERT_METHOD
ist nur für
MERGE
-Tabellen sinnvoll. Verwenden Sie
die Werte FIRST
oder
LAST
, um die Einfügung in die erste bzw.
letzte Tabelle vorzunehmen, oder NO
, um
Einfügeoperationen ganz auszuschließen. Siehe auch
Abschnitt 14.3, „Die MERGE
-Speicher-Engine“.
DATA DIRECTORY
, INDEX
DIRECTORY
Mithilfe von DATA
DIRECTORY='
oder directory
'INDEX
DIRECTORY='
können Sie angeben, wo die
directory
'MyISAM
-Speicher-Engine die Daten- und
Indexdatei einer Tabelle ablegen soll.
directory
muss als vollständiger
Pfadname zum Verzeichnis angegeben werden; relative Pfade
sind nicht möglich.
Diese Optionen funktionieren nur, wenn Sie die Option
--skip-symbolic-links
nicht verwenden.
Außerdem muss Ihr Betriebssystem über einen
funktionsfähigen und Thread-sicheren
realpath()
-Aufruf verfügen. Weitere
Informationen finden Sie in
Abschnitt 7.6.1.2, „Benutzung symbolischer Links für Tabellen“.
Partitionierungsoptionen
(partition_options
) können zur
Steuerung der Partitionierung einer Tabelle benutzt werden,
die mit CREATE TABLE
erstellt wurde.
Sofern angegeben, muss mindestens eine PARTITION
BY
-Klausel enthalten sein. Diese Klausel enthält
die Funktion, die zur Bestimmung der Partition verwendet
wird. Die Funktion gibt einen ganzzahligen Wert zwischen 1
und num
zurück, wobei
num
die Gesamtzahl der
Partitionen ist. Die nachfolgende Liste zeigt die
Auswahlmöglichkeiten für diese Funktion in MySQL
5.1.
Wichtig: Nicht alle zu
Beginn dieses Abschnitts in der Syntax für
partition_options
aufgeführten
Optionen stehen für alle Partitionierungstypen zur
Verfügung. Entnehmen Sie den Listings für die jeweiligen
Typen die passenden Informationen. Weitere Informationen zu
Wirkungsweise und Anwendungsmöglichkeiten der
Partitionierung in MySQL sowie zusätzliche Beispiele zur
Tabellenerstellung und zu anderen partitionierungsbezogenen
Anweisungen in MySQL finden Sie in
Kapitel 17, Partitionierung.
HASH(
:
Führt ein Hashing einer oder mehrerer Spalten aus, um
einen Schlüssel zum Platzieren und Wiederauffinden von
Datensätzen zu erstellen.
expr
)expr
ist ein Ausdruck, der
eine oder mehrere Tabellenspalten verwendet. Dabei kann
es sich um einen zulässigen MySQL-Ausdruck
(einschließlich MySQL-Funktionen) handeln, der genau
einen Integer-Wert ausgibt. Die nachfolgenden
CREATE TABLE
-Anweisungen mit
PARTITION BY HASH
-Option etwa sind
alle zulässig:
CREATE TABLE t1 (col1 INT, col2 CHAR(5)) PARTITION BY HASH(col1); CREATE TABLE t1 (col1 INT, col2 CHAR(5)) PARTITION BY HASH( ORD(col2) ); CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATETIME) PARTITION BY HASH ( YEAR(col3) );
VALUES LESS THAN
- und VALUES
IN
-Klauseln dürfen nicht mit
PARTITION BY HASH
gemeinsam
eingesetzt werden.
PARTITION BY HASH
verwendet den Rest
des Ausdrucks expr
geteilt
durch die Anzahl der Partitionen (d. h. den Modulo).
Beispiele und Informationen finden Sie in
Abschnitt 17.2.3, „HASH
-Partitionierung“.
Das Schlüsselwort LINEAR
bringt
einen etwas anderen Algorithmus mit sich. In diesem Fall
wird die Nummer der Partition, auf der ein Datensatz
gespeichert ist, als Ergebnis einer oder mehrerer
logischer AND
-Operationen ermittelt.
Eine Beschreibung und Beispiele für das lineare Hashing
finden Sie in
Abschnitt 17.2.3.1, „LINEAR HASH
-Partitionierung“.
KEY(
:
Dies ähnelt column_list
)HASH
, nur wird die
Hashing-Funktion hier von MySQL selbst bereitgestellt,
um eine gleichmäßige Datenverteilung zu
gewährleisten. Das Argument
column_list
ist eine einfache
Liste mit Tabellenspalten. Dieses Beispiel zeigt eine
einfache, durch einen Schlüssel partitionierte Tabelle
mit vier Partitionen:
CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY KEY(col3) PARTITIONS 4;
Bei Tabellen, die durch einen Schlüssel partitioniert
sind, können Sie die lineare Partitionierung durch
Angabe des Schlüsselworts LINEAR
benutzen. Dies hat die gleichen Auswirkungen wie bei
Tabellen, die mit HASH
partitioniert
wurden: Die Partitionsnummer wird mithilfe des Operators
&
statt über den Modulo
ermittelt (siehe auch
Abschnitt 17.2.3.1, „LINEAR HASH
-Partitionierung“, und
Abschnitt 17.2.4, „KEY
-Partitionierung“). Dieses Beispiel
verwendet die lineare Partitionierung über einen
Schlüssel, um Daten auf fünf Partitionen zu verteilen:
CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY LINEAR KEY(col3) PARTITIONS 5;
VALUES LESS THAN
- und VALUES
IN
-Klauseln dürfen nicht mit
PARTITION BY KEY
gemeinsam eingesetzt
werden.
RANGE
: In diesem Fall zeigt
expr
unter Verwendung einer
Menge von VALUES LESS THAN
-Operatoren
einen Wertebereich an. Wenn Sie die
Bereichspartitionierung verwenden, müssen Sie
mindestens eine Partition mit VALUES LESS
THAN
angeben. VALUES IN
können Sie bei der Bereichspartitionierung nicht
einsetzen.
VALUES LESS THAN
kann entweder mit
einem literalen Wert oder einem Ausdruck benutzt werden,
der genau einen Wert zurückgibt.
Angenommen, Sie haben eine Tabelle, die Sie nach einer Spalte partitionieren wollen, die Jahreswerte enthält. Hierbei wollen Sie das folgende Schema verwenden:
Partitionsnummer: | Jahre |
0 | 1990 und früher |
1 | 1991–1994 |
2 | 1995–1998 |
3 | 1999–2002 |
4 | 2003–2005 |
5 | 2006 und später |
Eine Tabelle, die dieses Partitionierungsschema
implementiert, kann mit der folgenden CREATE
TABLE
-Anweisung erstellt werden:
CREATE TABLE t1 ( year_col INT, some_data INT ) PARTITION BY RANGE (year_col) ( PARTITION p0 VALUES LESS THAN (1991), PARTITION p1 VALUES LESS THAN (1995), PARTITION p2 VALUES LESS THAN (1999), PARTITION p3 VALUES LESS THAN (2002), PARTITION p4 VALUES LESS THAN (2006), PARTITION p5 VALUES LESS THAN MAXVALUE );
PARTITION ... VALUES LESS THAN
...
-Anweisungen arbeiten konsekutiv, d. h.,
VALUES LESS THAN MAXVALUE
verarbeitet
die „übrig gebliebenen“ Werte, die
größer sind als der anderweitig angegebene
Maximalwert.
Beachten Sie, dass VALUES LESS
THAN
-Klauseln sequenziell auf eine Weise
verarbeitet werden, die der von
case
-Abschnitten eines
switch ... case
-Blocks ähnelt, wie
man sie aus vielen Programmiersprachen wie C, Java oder
PHP her kennt: Die Klauseln müssen so angeordnet sein,
dass der obere Grenzwert einer nachfolgenden
VALUES LESS THAN
-Klausel größer ist
als der der vorherigen Klausel; dabei muss
MAXVALUE
als Letztes in der Liste
erscheinen.
LIST(
:
Dies ist praktisch, wenn man Partitionen basierend auf
einer Tabellenspalte mit einer beschränkten Menge
möglicher Werte (z. B. Land, PLZ usw.) konfiguriert.
In einem solchen Fall lassen sich alle Datensätze, die
einem bestimmten Land oder einer PLZ zuzuordnen sind,
derselben Partition zuweisen, oder eine Partition kann
für bestimmte Länder oder Postleitzahlen reserviert
werden. Dies ähnelt expr
)RANGE
mit der
Einschränkung, dass nur VALUES IN
zur Angabe zulässiger Werte für jede Partition
verwendet werden kann.
VALUES IN
wird mit einer Liste
passender Werte benutzt. Beispielsweise könnten Sie ein
Partitionierungsschema wie das folgende erstellen:
CREATE TABLE client_firms ( id INT, name VARCHAR(35) ) PARTITION BY LIST (id) ( PARTITION r0 VALUES IN (1, 5, 9, 13, 17, 21), PARTITION r1 VALUES IN (2, 6, 10, 14, 18, 22), PARTITION r2 VALUES IN (3, 7, 11, 15, 19, 23), PARTITION r3 VALUES IN (4, 8, 12, 16, 20, 24) );
Wenn Sie die Listenpartitionierung verwenden, müssen
Sie mindestens eine Partition mit VALUES
IN
angeben. VALUES LESS
THAN
können Sie bei der Listenpartitionierung
nicht einsetzen.
Hinweis: Derzeit darf
die für VALUES IN
verwendete
Werteliste nur aus Integers bestehen.
Die Anzahl der Partitionen kann optional mit einer
PARTITIONS
-Klausel
angegeben werden, wobei num
num
die Anzahl der Partitionen ist. Werden diese Klausel
und beliebige
PARTITION
-Klauseln verwendet, muss
num
gleich der Anzahl aller
Partitionen sein, die mit
PARTITION
-Klauseln deklariert wurden.
Hinweis: Unabhängig
davon, ob Sie eine PARTITIONS
-Klausel
bei der Erstellung einer Tabelle verwenden, die mit
RANGE
oder LIST
partitioniert wurde, müssen Sie in jedem Fall
mindestens eine PARTITION
VALUES
-Klausel in der Tabellendefinition
angeben (siehe unten).
Eine Partition kann optional in eine Anzahl
Unterpartitionen aufgeteilt werden. Dies kann durch
Verwendung der optionalen Klausel SUBPARTITION
BY
angegeben werden. Die Unterpartitionierung
kann mit HASH
oder
KEY
erfolgen. Beide können
LINEAR
sein. Sie funktionieren auf
die gleiche Weise wie oben für die entsprechenden
Partitionierungstypen beschrieben. (Es ist nicht
möglich, Unterpartitionen nach LIST
oder RANGE
zu erstellen.)
Die Anzahl der Unterpartitionen kann mit dem
Schlüsselwort SUBPARTITIONS
, gefolgt
von einem Integer-Wert, angegeben werden.
Jede Partition kann individuell mit einer
partition_definition
-Klausel
definiert werden. Die einzelnen Teile, aus denen die Klausel
besteht, sind die folgenden:
PARTITION
:
Gibt einen logischen Namen für die Partition an.
partition_name
VALUES
-Klausel: Bei der
Bereichspartitionierung muss jede Partition eine
VALUES LESS THAN
-Klausel enthalten,
und bei der Listenpartitionierung müssen Sie eine
VALUES IN
-Klausel je Partition
angeben. Hiermit wird bestimmt, welche Datensätze in
dieser Partition gespeichert werden sollen. Weitere
Informationen und Syntaxinformationen entnehmen Sie der
Beschreibung der Partitionierungstypen in
Kapitel 17, Partitionierung.
Eine optionale COMMENT
-Klausel kann
zur Beschreibung der Partition angegeben werden. Der
Kommentar muss in einzelne Anführungszeichen gesetzt
werden. Beispiel:
COMMENT = 'Data for the years previous to 1999'
DATA DIRECTORY
und INDEX
DIRECTORY
können zur Angabe des
Verzeichnisses verwendet werden, in dem die Daten bzw.
die Indizes dieser Partition gespeichert werden sollen.
Sowohl
als auch
data_dir
müssen absolute Pfadnamen sein. Beispiel:
index_dir
CREATE TABLE th (id INT, name VARCHAR(30), adate DATE) PARTITION BY LIST(YEAR(adate)) ( PARTITION p1999 VALUES IN (1995, 1999, 2003) DATA DIRECTORY = '/var/appdata/95/data
' INDEX DIRECTORY = '/var/appdata/95/idx
', PARTITION p2000 VALUES IN (1996, 2000, 2004) DATA DIRECTORY = '/var/appdata/96/data
' INDEX DIRECTORY = '/var/appdata/96/idx
', PARTITION p2001 VALUES IN (1997, 2001, 2005) DATA DIRECTORY = '/var/appdata/97/data
' INDEX DIRECTORY = '/var/appdata/97/idx
', PARTITION p2000 VALUES IN (1998, 2002, 2006) DATA DIRECTORY = '/var/appdata/98/data
' INDEX DIRECTORY = '/var/appdata/98/idx
' );
DATA DIRECTORY
und INDEX
DIRECTORY
verhalten sich genauso wie in der
table_option
-Klausel einer
CREATE TABLE
-Anweisung bei
MyISAM
-Tabellen.
Je Partition können ein Daten- und ein Indexverzeichnis angegeben werden. Wenn keine Angaben gemacht werden, werden Daten und Indizes standardmäßig im MySQL-Datenverzeichnis abgelegt.
MAX_ROWS
und
MIN_ROWS
können zur Angabe der
größten bzw. kleinsten Zahl von Datensätzen verwendet
werden, die in der Partition gespeichert werden. Die
Werte für max_number_of_rows
und min_number_of_rows
müssen positive ganze Zahlen sein. Wie bei den
gleichnamigen Optionen auf Tabellenebene sind auch dies
keine festen Grenzwerte, sondern nur
„Vorschläge“ für den Server.
Die optionale TABLESPACE
-Klausel kann
zur Angabe eines Tablespaces für die Partition
verwendet werden. (Nur für MySQL Cluster.)
Die optionale [STORAGE]
ENGINE
-Klausel bewirkt, dass die Tabelle in
dieser Partition die angegebene Speicher-Engine
verwendet. Dies kann jede der vom betreffenden MySQL
Server unterstützten Engines sein. Sowohl das
Schlüsselwort STORAGE
als auch das
Gleichheitszeichen (=
) sind optional.
Wird keine partitionsspezifische Speicher-Engine mit
dieser Option angegeben, dann wird die für die gesamte
Tabelle gültige Engine auch für diese Partition
verwendet.
Hinweis: Der
Partitionierungs-Handler akzeptiert eine Option
[STORAGE] ENGINE
sowohl für
PARTITION
als auch für
SUBPARTITION
. Die derzeit einzige
Möglichkeit, diese Klausel zu nutzen, besteht darin,
alle Partitionen oder alle Unterpartitionen auf dieselbe
Speicher-Engine zu setzen. Der Versuch, verschiedene
Engines für Partitionen oder Unterpartitionen einer
Tabelle einzustellen, führt zum Fehler ERROR
1469 (HY000): The mix of handlers in the partitions is
not allowed in this version of MySQL
. Wir
beabsichtigen, diese partitionierungsbezogene
Einschränkung in einem zukünftigen Release von MySQL
5.1 zu beseitigen.
Die Option NODEGROUP
kann verwendet
werden, um diese Partition zu einem Teil der
Knotengruppe zu machen, die als
node_group_id
angegeben ist.
(Nur für MySQL Cluster.)
Die Partitionsdefinition kann optional eine oder mehrere
subpartition_definition
-Klauseln
enthalten. Jede dieser Klauseln umfasst zumindest
SUBPARTITION
, wobei
name
name
ein Bezeichner für die
Unterpartition ist. Die Syntax für eine
Unterpartitionsdefinition ist mit der einer Partition
bis auf die Tatsache identisch, dass das Schlüsselwort
PARTITION
durch
SUBPARTITION
zu ersetzen ist.
Die Unterpartitionierung muss über
HASH
oder KEY
erfolgen und kann nur bei RANGE
- oder
LIST
-Partitionen durchgeführt
werden. Siehe auch
Abschnitt 17.2.5, „Unterpartitionen“.
Partitionen können geändert, verbunden und zu Tabellen
hinzugefügt sowie aus diesen gelöscht werden. Grundlegende
Informationen zu den MySQL-Anweisungen, mit denen diese
Aufgaben erledigt werden, finden Sie in
Abschnitt 13.1.2, „ALTER TABLE
“. Detaillierte Beschreibungen
und Beispiele finden Sie in
Abschnitt 17.3, „Partitionsverwaltung“.
Sie können eine Tabelle aus einer anderen Tabelle erstellen,
indem Sie am Ende der CREATE TABLE
-Anweisung
eine SELECT
-Anweisung hinzufügen:
CREATE TABLEnew_tbl
SELECT * FROMorig_tbl
;
MySQL erstellt neue Spalten für alle Elemente in der
SELECT
-Anweisung. Zum Beispiel:
mysql>CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,
->PRIMARY KEY (a), KEY(b))
->ENGINE=MyISAM SELECT b,c FROM test2;
Hierbei wird eine MyISAM
-Tabelle mit drei
Spalten a
, b
und
c
erstellt. Beachten Sie, dass die Spalten
aus der SELECT
-Anweisung rechts an die
Tabelle angehängt und nicht in diese eingesetzt werden.
Betrachten Sie einmal das folgende Beispiel:
mysql>SELECT * FROM foo;
+---+ | n | +---+ | 1 | +---+ mysql>CREATE TABLE bar (m INT) SELECT n FROM foo;
Query OK, 1 row affected (0.02 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql>SELECT * FROM bar;
+------+---+ | m | n | +------+---+ | NULL | 1 | +------+---+ 1 row in set (0.00 sec)
Für jeden Datensatz in der Tabelle foo
wird
ein Datensatz in bar
mit den Werten aus
foo
und den Standardwerten bei neuen Spalten
eingefügt.
In einer Tabelle, die mit CREATE TABLE ...
SELECT
erstellt wurde, erscheinen die Spalten, die im
CREATE TABLE
-Teil genannt werden, zuerst. Die
in beiden Teilen oder nur im SELECT
-Teil
genannten Spalten folgen nach. Der Datentyp der
SELECT
-Spalten kann außer Kraft gesetzt
werden, indem die Spalte zusätzlich im CREATE
TABLE
-Teil genannt wird.
Wenn während des Kopierens der Daten in die Tabelle Fehler auftreten, wird diese automatisch gelöscht und nicht erstellt.
CREATE TABLE ... SELECT
erstellt keine
automatischen Indizes. Dies wurde bewusst so eingerichtet, um
die Anweisung so flexibel wie möglich zu halten. Wenn Sie
wollen, dass Indizes in der Tabelle erstellt werden, müssen Sie
diese vor der SELECT
-Anweisung spezifizieren:
mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
Es kann dadurch zu Fällen von Datentypkonvertierung kommen. So
wird z. B. das AUTO_INCREMENT
-Attribut nicht
beibehalten, und VARCHAR
-Spalten können in
CHAR
-Spalten umgewandelt werden.
Wenn Sie eine Tabelle mit CREATE ... SELECT
erstellen, müssen Sie in jedem Fall Aliase für
Funktionsaufrufe oder Ausdrücke in der Abfrage verwenden.
Andernfalls kann die CREATE
-Anweisung
fehlschlagen, oder es können unerwünschte Spaltennamen
entstehen.
CREATE TABLE artists_and_works SELECT artist.name, COUNT(work.artist_id) AS number_of_works FROM artist LEFT JOIN work ON artist.id = work.artist_id GROUP BY artist.id;
Sie können den Typ einer erzeugten Spalte auch explizit angeben:
CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM bar;
Mit LIKE
können Sie eine leere Tabelle
basierend auf der Definition einer anderen Tabelle
einschließlich aller Spaltenattribute und Indizes erstellen,
die auch in der Ursprungstabelle vorhanden sind:
CREATE TABLEnew_tbl
LIKEorig_tbl
;
CREATE TABLE ... LIKE
behält weder für die
Ursprungstabelle angegebene DATA DIRECTORY
-
und INDEX DIRECTORY
-Optionen noch
Fremdschlüsseldefinitionen bei.
Sie können dem SELECT
ein
IGNORE
oder REPLACE
voranstellen, um anzugeben, wie mit Datensätzen zu verfahren
ist, in denen Dubletten für eindeutige Schlüssel auftreten.
Bei IGNORE
werden neue Datensätze, die eine
Dublette eines eindeutigen Schlüssels für einen bereits
vorhandenen Datensatz enthalten, einfach verworfen. Wenn Sie
REPLACE
angeben, ersetzen die neuen die
vorhandenen Datensätze, die denselben eindeutigen
Schlüsselwert aufweisen. Werden weder IGNORE
noch REPLACE
angegeben, dann führt das
Auftreten von Dubletten eindeutiger Schlüssel zu einem Fehler.
Um sicherzustellen, dass das Binärlog zur Wiederherstellung der
Originaltabellen verwendet werden kann, gestattet MySQL keine
gleichzeitigen Einfügeoperationen während der Ausführung
einer CREATE TABLE ... SELECT
-Anweisung.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.