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_nametype[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_typeindex_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_dirmax_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_dirmax_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
            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_nameWHEREauto_colIS 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_nameSHOW 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
            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, „DieBDB-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 inMyISAM-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 auchMRG_MyISAM. Siehe auch
                Abschnitt 14.3, „DieMERGE-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 = NAUTO_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 numnum
                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
                data_dirindex_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
                namename 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_tblSELECT * 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_tblLIKEorig_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.

