CREATE [TEMPORARY] TABLE [IF NOT EXISTS]tbl_name(create_definition,...) [table_options] [partition_options]
または
CREATE [TEMPORARY] TABLE [IF NOT EXISTS]tbl_name[(create_definition,...)] [table_options] [partition_options]select_statement
または
CREATE [TEMPORARY] TABLE [IF NOT EXISTS]tbl_name{ LIKEold_tbl_name| (LIKEold_tbl_name) }
create_definition:col_namecolumn_definition| [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...) [index_option] ... | {INDEX|KEY} [index_name] [index_type] (index_col_name,...) [index_option] ... | [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...) [index_option] ... | {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...) [index_option] ... | [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...)reference_definition| CHECK (expr)column_definition:data_type[NOT NULL | NULL] [DEFAULTdefault_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string'] [COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}] [STORAGE {DISK|MEMORY|DEFAULT}] [reference_definition]data_type: BIT[(length)] | 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)] [CHARACTER SETcharset_name] [COLLATEcollation_name] | VARCHAR(length) [CHARACTER SETcharset_name] [COLLATEcollation_name] | BINARY[(length)] | VARBINARY(length) | TINYBLOB | BLOB | MEDIUMBLOB | LONGBLOB | TINYTEXT [BINARY] [CHARACTER SETcharset_name] [COLLATEcollation_name] | TEXT [BINARY] [CHARACTER SETcharset_name] [COLLATEcollation_name] | MEDIUMTEXT [BINARY] [CHARACTER SETcharset_name] [COLLATEcollation_name] | LONGTEXT [BINARY] [CHARACTER SETcharset_name] [COLLATEcollation_name] | ENUM(value1,value2,value3,...) [CHARACTER SETcharset_name] [COLLATEcollation_name] | SET(value1,value2,value3,...) [CHARACTER SETcharset_name] [COLLATEcollation_name] |spatial_typeindex_col_name:col_name[(length)] [ASC | DESC]index_type: USING {BTREE | HASH | RTREE}index_option: KEY_BLOCK_SIZE [=]value|index_type| WITH PARSERparser_namereference_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 [=]engine_name| AUTO_INCREMENT [=]value| AVG_ROW_LENGTH [=]value| [DEFAULT] CHARACTER SET [=]charset_name| CHECKSUM [=] {0 | 1} | [DEFAULT] COLLATE [=]collation_name| COMMENT [=] 'string' | CONNECTION [=] 'connect_string' | DATA DIRECTORY [=] 'absolute path to directory' | DELAY_KEY_WRITE [=] {0 | 1} | INDEX DIRECTORY [=] 'absolute path to directory' | INSERT_METHOD [=] { NO | FIRST | LAST } | KEY_BLOCK_SIZE [=]value| MAX_ROWS [=]value| MIN_ROWS [=]value| PACK_KEYS [=] {0 | 1 | DEFAULT} | PASSWORD [=] 'string' | ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT} | TABLESPACEtablespace_name[STORAGE {DISK|MEMORY|DEFAULT}] | UNION [=] (tbl_name[,tbl_name]...)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
        は、与えられた名前でデータベースを作成します。テーブルに対して
        CREATE
        権限を持つ必要があります。
      
項5.2. 「スキーマオブジェクト名」 に許容テーブル名の規則が紹介されています。デフォルトによって、デフォルトデータベースの中にテーブルが作成されます。テーブルがすでに存在したり、デフォルトデータベースが無かったり、データベースが存在しなかったりするとエラーが発生します。
        指定データベース内にテーブルを作成するには、テーブル名を
        db_name.tbl_name
        と指定することができます。この作業は、デフォルトデータベースが無くても、あると仮定して行われます。もし引用識別子を利用するなら、データベースとテーブル名は別々に引用してください。たとえば、`mydb`.`mytbl`
        と記述し、`mydb.mytbl`
        とはしないでください。
      
        テーブルを作成するとき、TEMPORARY
        キーワードを利用することができます。TEMPORARY
        テーブルは現在の接続でのみ現れ、接続が終了すると自動的にドロップされます。これは、2
        つの異なる接続同士、または、既存の同名の非
        TEMPORARY
        テーブルとお互いに対立する事無く、同じ一時テーブル名を利用することができるという意味になります。(一時テーブルがドロップされるまで、既存テーブルは隠されています)。一時テーブルを作成するためには
        CREATE TEMPORARY
        TABLES 権限を持つ必要があります。
      
          TEMPORARY
          キーワードを使用する場合は、CREATE
          TABLE
          によって、現在のアクティブなトランザクションは自動的にはコミットされません。
        
        もしテーブルが存在すると IF
        NOT EXISTS
        キーワードはエラーが起こるのを防ぎます。しかし、CREATE
        TABLE
        ステートメントに指示されたテーブルと既存テーブルが同一の構造であることの照合は行われません。
      
        MySQL
        はそれぞれのテーブルをデータベースディレクトリ内に
        .frm
        テーブルフォーマットで表します。テーブルのストレージエンジンは別のファイルを作成することもあります。MyISAM
        テーブルの場合、ストレージエンジンはデータとインデックスファイルを作成します。そのため、各
        MyISAM テーブル
        tbl_name に対して、3
        つのディスクファイルが存在します。
      
| ファイル | 目的 | 
|  | テーブルフォーマット (定義) ファイル | 
|  | データファイル | 
|  | インデックスファイル | 
Storage Engines でテーブルを表すためにそれぞれのストレージエンジンがどのファイルを作成するのか説明されています。もしテーブル名が特別な文字を含んでいる場合、そのテーブルファイルの名前は項5.2.3. 「識別子からファイル名へのマッピング」に表されているようにそれらの文字が暗号化された形を含んだものになります。
        data_type
        は、カラム定義内のデータ型を表します。spatial_type
        は空間データ型を意味します。表示されるデータ型構文はただの見本です。カラムデータ型を指定するために使用できる構文の完全な説明や、各型のプロパティーに関する情報については、章 6. データ型
        および 項7.13. 「空間拡張」
        を参照してください。
      
        いくつかの属性はすべてのデータ型には対応しません。AUTO_INCREMENT
        は、整数型と浮動小数点型にのみ適用されます。DEFAULT
        は BLOB や
        TEXT
        型には対応しません。
      
            もし NULL か
            NOT NULL
            のどちらも指定されなければ、そのカラムは
            NULL
            が指定されたという形で扱われます。
          
            整数カラムまたは浮動小数点カラムには、追加属性
            AUTO_INCREMENT
            を含めることができます。インデックスされた
            AUTO_INCREMENT
            カラムに NULL
            (推奨) か 0
            の値を挿入すると、カラムは次のシーケンス値に設定されます。通常これは、value
            が現在テーブルの中にあるカラムの最大値である、value+1AUTO_INCREMENT
            シーケンスは 1
            で始まります。
          
            行の挿入後に
            AUTO_INCREMENT
            値を検索するには、LAST_INSERT_ID()
            SQL 機能か
            mysql_insert_id()
            C API
            関数を利用してください。項7.11.3. 「情報関数」、mysql_insert_id()
            を参照してください。
          
            もし
            NO_AUTO_VALUE_ON_ZERO
            SQL
            モードが有効であれば、新しいシーケンス値を発生させずに
            0 を
            AUTO_INCREMENT
            カラムに 0
            として格納することができます。Server SQL Modes
            を参照してください。
          
              テーブルごとに存在できる
              AUTO_INCREMENT
              カラムは 1
              つだけです。このカラムは、インデックス設定されている必要があり、DEFAULT
              値を割り当てることができません。AUTO_INCREMENT
              カラムは正数のみを含んでいるときだけ正しく機能します。負数を挿入すると、とても大きな正数を挿入したと解釈されます。これは、数字が正数から負数に
              「ラップ」
              されるときの精度の問題を避けるために、また
              0 を含む
              AUTO_INCREMENT
              カラムを誤って採用してしまわないために行われます。
            
            MyISAM
            テーブルには、複合カラムキー内の
            AUTO_INCREMENT
            セカンダリカラムを指定することができます。項1.6.9. 「AUTO_INCREMENT の使用」
            を参照してください。
          
            MySQL 互換性がいくつかの ODBC
            アプリケーション持つために、次のクエリーを利用して、最後に挿入された行に
            AUTO_INCREMENT
            値を見つけることができます。
          
SELECT * FROMtbl_nameWHEREauto_colIS NULL
            InnoDB と
            AUTO_INCREMENT
            の更なる情報に関しては、項9.4.3. 「InnoDB の
        AUTO_INCREMENT 処理」
            を参照してください。
          
            文字データ型
            (CHAR、VARCHAR、TEXT)
            は、キャラクタセットとカラムの照合を指定するために
            CHARACTER SET と
            COLLATE
            属性を含むことができます。詳細については、Character Set Supportをご参照ください。CHARSET
            は CHARACTER SET
            の同義語です。例 :
          
CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
            MySQL 5.1
            は、文字カラム定義内の長さ指定を文字数で解釈します。(MySQL
            4.1
            以前のバージョンでは、それらはバイトで解釈されます)。BINARY
            と VARBINARY
            の長さはバイトで表されています。
          
            
            
            DEFAULT
            節は、カラムのデフォルト値を指定します。例外がひとつあります。デフォルト値は一定でなければいけませんので、それは関数や式にはなり得ません。これはたとえば、日付カラムの値に
            NOW() や
            CURRENT_DATE
            のような関数の値をデフォルトとして設定することはできないという意味です。例外として、TIMESTAMP
            カラムのデフォルトとして
            CURRENT_TIMESTAMP
            を指定することができます。項6.3.1.1. 「TIMESTAMP の特性」
            を参照してください。
          
            もしカラム定義が明示的な
            DEFAULT
            値を含まない場合、MySQL はデフォルト値を
            項6.1.4. 「データ型デフォルト値」
            のように規定します。
          
            BLOB と
            TEXT
            カラムはデフォルト値として指定することができません。
          
            厳密な SQL
            モードが有効になっていない場合でも、日付の値のデフォルトが
            NO_ZERO_IN_DATE
            の SQL
            モードに従っていない場合は、CREATE
            TABLE
            が失敗します。たとえば、c1
            DATE DEFAULT '2010-00-00'
            を指定すると、CREATE
            TABLE が Invalid default
            value for 'c1' で失敗します。
          
MySQL Cluster NDB 7.1
              以降でのネイティブなデフォルト値の処理. 
              MySQL Cluster NDB 7.1.0
              からは、テーブルカラムのデフォルト値は、以前のように
              MySQL
              サーバーではなく、NDBCLUSTER
              によって格納されます。SQL
              ノードからデータノードに送信する必要のあるデータが少なくなるため、カラムのデフォルト値を持つテーブルへの挿入を以前より効率的に実行できます。
            
            以前の MySQL Cluster
            リリースを使用して作成されたテーブルは
            MySQL Cluster 7.1.0
            以降でも引き続き使用できますが、ネイティブなデフォルト値をサポートしていないため、アップグレードされるまでは
            MySQL
            サーバーによって指定されたデフォルト値を引き続き使用します。これは、オフラインの
            ALTER TABLE
            ステートメントを使用して実行できます。
          
              オンラインの
              ALTER TABLE
              操作を使用して、テーブルカラムのデフォルト値を設定または変更することはできません。
            
MySQL Cluster NDB 7.1.0 以降で作成されたテーブルを、以前のバージョンの MySQL Cluster で使用することはできません。
            ネイティブなデフォルト値をサポートする
            NDBCLUSTER
            テーブルは、MySQL
            サーバーによって課されるデフォルト値に関する制限に引き続き従います。詳細は
            項6.1.4. 「データ型デフォルト値」
            をご覧ください。
          
            
            カラムのコメントは、COMMENT
            オプションを使用して、最大 255
            文字の長さまで指定できます。コメントは
            SHOW CREATE
            TABLE と
            SHOW
            FULL COLUMNS
            ステートメントによって表示されます。
          
            
            MySQL Cluster NDB 6.2.5 および MySQL Cluster NDB 6.3.2
            からは、COLUMN_FORMAT
            を使用して、NDB
            テーブルの個々のカラムのデータストレージ形式を指定することもできます。許可されるカラム形式は、FIXED、DYNAMIC、および
            DEFAULT
            です。FIXED
            は固定幅ストレージを指定するために使用され、DYNAMIC
            はカラムを可変幅にできるようにします。また、DEFAULT
            は、カラムのデータ型に従って固定幅または可変幅のストレージが使用されるようにします
            (ROW_FORMAT
            指定子によってオーバーライドされる可能性がある)。
          
            NDB
            テーブルの場合、COLUMN_FORMAT
            のデフォルト値は
            DEFAULT です。
          
            COLUMN_FORMAT
            は現在、NDB
            以外のストレージエンジンを使用しているテーブルのカラムには影響を与えません。
          
            
            NDB
            テーブルの場合、MySQL Cluster NDB 6.2.5 および
            MySQL Cluster NDB 6.3.2
            からは、STORAGE
            節を使用してカラムをディスク上またはメモリー内のどちらに格納するかを指定することもできます。STORAGE
            DISK
            を指定するとカラムはディスク上に格納され、STORAGE
            MEMORY
            を指定するとインメモリーストレージが使用されます。使用される
            CREATE TABLE
            ステートメントには、引き続き
            TABLESPACE
            節を含める必要があります。
          
mysql>CREATE TABLE t1 (->c1 INT STORAGE DISK,->c2 INT STORAGE MEMORY->) ENGINE NDB;ERROR 1005 (HY000): Can't create table 'c.t1' (errno: 140) mysql>CREATE TABLE t1 (->c1 INT STORAGE DISK,->c2 INT STORAGE MEMORY->) TABLESPACE ts_1 ENGINE NDB;Query OK, 0 rows affected (1.06 sec)
            NDB
            テーブルの場合、STORAGE
            DEFAULT は STORAGE
            MEMORY と同等です。
          
            STORAGE
            節は、NDB
            以外のストレージエンジンを使用しているテーブルには影響を与えません。
          
            KEY は通常
            INDEX
            の同義語です。キー属性
            PRIMARY KEY
            はまた、カラム定義の中では単に
            KEY
            として指定できます。これは、互換性のためにほかのデータベースと共に利用されます。
          
            UNIQUE
            インデックスは、インデックス内のすべての値は明確でなければいけないというような制限を作成します。既存行とマッチするキー値の新しい行を追加しようとするとエラーが発生します。すべてのエンジンに対して、UNIQUE
            インデックスは
            NULL
            を含むことができるカラムの複数
            NULL
            値を許容します。
          
            
            PRIMARY KEY
            は、すべてのキーカラムを
            NOT NULL
            として定義する必要のある一意のインデックスです。もしそれらが
            NOT NULL
            として明示的に宣言されなければ、MySQL
            はそれらを暗示的に (そして静かに)
            宣言します。1 つのテーブルは 1 つの
            PRIMARY KEY
            しか持つことができません。もし
            PRIMARY KEY
            がないのにアプリケーションがテーブル内で
            PRIMARY KEY
            を要求したら、MySQL は
            PRIMARY KEY として
            NULL
            カラムを持たない最初の
            UNIQUE
            インデックスを返します。
          
            InnoDB
            テーブル内で長い PRIMARY
            KEY
            を持つとスペースを無駄に利用します。(詳しくは
            項9.10. 「InnoDB
      テーブルとインデックス構造」
            を参照してください。)
          
            作成されたテーブルでは、PRIMARY
            KEY
            が最初に配置され、そのあとにすべての
            UNIQUE
            インデックス、さらに一意でないインデックスが続きます。このおかげで
            MySQL
            オプティマイザがどのインデックスを優先して利用するのか、また複製
            UNIQUE
            キーをより早く検索するために役立ちます。
          
            PRIMARY KEY
            は複合カラムインデックスになり得ます。しかし、カラム仕様内で
            PRIMARY KEY
            キー属性を利用して複合カラムインデックスを作成することはできません。それをしても、単一カラムが最初に来るという印が付けられるだけです。別々の
            PRIMARY
            KEY( 節を利用しなければいけません。
          index_col_name,
            ...)
            
            PRIMARY KEY または
            UNIQUE
            インデックスが、整数型を含む 1
            つのカラムのみで構成されている場合は、SELECT
            ステートメントでそのカラムを
            _rowid
            として参照することもできます。
          
            MySQL 内では、PRIMARY
            KEY の名前は
            PRIMARY
            です。ほかのインデックスに関しては、もし名前を割り当てなければ、それを固有のものにするために任意のサフィックス
            (_2、_3、...)
            を利用して、最初にインデックスされたカラムと同じ名前に指定されます。SHOW
            INDEX FROM 
            を使用して、テーブルのインデックス名を確認できます。項8.5.5.23. 「tbl_nameSHOW INDEX 構文」
            を参照してください。
          
            いくつかのストレージエンジンでは、インデックスを作成するときに型を指定することができます。index_type
            指定子の構文は USING
             です。
          type_name
例 :
CREATE TABLE lookup (id INT, INDEX USING BTREE (id)) ENGINE = MEMORY;
            MySQL 5.1.10
            以前では、USING
            はインデックスカラムリストの前だけに与えることができました。5.1.10
            での望ましい位置は、カラムリストの後ろです。このオプションをカラムリストの前で使用すると、将来の
            MySQL リリースでは認識されなくなります。
          
            index_option
            値はインデックスの追加オプションを指定します。USING
            はそのようなオプションの 1 つです。許容
            index_option
            値の詳細に関しては 項8.1.13. 「CREATE INDEX 構文」
            を参照してください。
          
インデックスに関する更なる情報については、項4.4.4. 「MySQL におけるインデックスの使用」 を参照してください。
            
            
            MySQL 5.1
            では、MyISAM、InnoDB、および
            MEMORY
            ストレージエンジンのみが、NULL
            値を含むことのできるカラム上のインデックスをサポートしています。それ以外の場合、インデックスされたカラムを
            NOT NULL
            として宣言しなければエラーが発生します。
          
            CHAR、VARCHAR、BINARY、そして
            VARBINARY
            カラムには、インデックス接頭辞長を指定するために
            col_name(length)BLOB
            および
            TEXT
            カラムもインデックス設定できますが、接頭辞長を指定する必要があります。接頭辞長は、バイナリ以外の文字列型の場合は文字数で、バイナリ列型の場合はバイト単位で指定されます。これは、インデックスエントリは
            CHAR、VARCHAR、そして
            TEXT
            カラムのそれぞれのカラム値の最初の
            length 文字で、そして
            BINARY、VARBINARY、そして
            BLOB
            カラムのそれぞれのカラム値の最初の
            length
            バイトで成り立っているということです。このようにカラム値の接頭辞だけをインデックスすることで、インデックスファイルをとても小さくすることができます。項4.4.2. 「カラムインデックス」
            を参照してください。
          
            MyISAM と
            InnoDB
            ストレージエンジンだけが
            BLOB と
            TEXT
            カラムのインデックスをサポートします。例
            :
          
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
            接頭辞は、最大 1000 バイトの長さ
            (InnoDB
            テーブルに対しては 767 バイト)
            まで可能です。接頭辞の制限がバイト単位で測定されるのに対して、CREATE
            TABLE
            ステートメントの接頭辞長は、バイナリ以外のデータ型
            (CHAR、VARCHAR、TEXT)
            では文字数として解釈されることに注意してください。マルチバイトのキャラクタセットを利用するカラムの接頭辞長を指定するときにはこれを考慮に入れておいてください。
          
            index_col_name 仕様は
            ASC か
            DESC
            で終わることができます。これらのキーワードは昇順や降順インデックス値ストレージを指定するための将来の拡張子として許容されます。現在は、それらは解析されますが無視されます。インデックス値は毎回昇順で格納されます。
          
            SELECT 内の
            TEXT か
            BLOB
            カラムに対して
            ORDER BY か
            GROUP BY
            を利用するとき、サーバーは
            max_sort_length
            システム変数によって指示された初期バイト数だけを利用して値をソートします。項6.4.3. 「BLOB と
        TEXT 型」
            を参照してください。
          
            フルテキスト検索に利用される特別な
            FULLTEXT
            インデックスを作成することができます。MyISAM
            ストレージエンジンだけが
            FULLTEXT
            インデックスをサポートします。それらは
            CHAR、VARCHAR、そして
            TEXT
            カラムからのみ作成することができます。インデックス設定は常に、カラム全体に対して実行されます。カラム接頭辞のインデックス設定はサポートされていないため、接頭辞長が指定されても無視されます。操作に関しての詳細は
            項7.8. 「全文検索関数」
            を参照してください。WITH
            PARSER
            節は、もしフルテキストインデックスと検索操作が特別対応を必要とするなら、インデックスと共にパーサープラグインと提携するために
            index_option
            値として指定することができます。この節は
            FULLTEXT
            インデックスだけに対して正当です。プラグインの作成に関しての詳細はThe MySQL Plugin API
            を参照してください。
          
            空間データ型上に
            SPATIAL
            インデックスを作成することができます。空間型は
            MyISAM
            テーブルに対してだけサポートされており、インデックスされたカラムは
            NOT NULL
            として宣言されなければいけません。項7.13. 「空間拡張」
            を参照してください。
          
            InnoDB
            テーブルは外部キー制約の確認をサポートします。詳しくは章 9. InnoDB ストレージエンジンを参照してください。InnoDB
            の FOREIGN KEY
            構文は、この節の最初に
            CREATE TABLE
            ステートメントに対して示した構文より制限が強いことに注意してください。参照されるテーブルのカラムは常に、明示的に指定される必要があります。InnoDB
            は、外部キーへの ON
            DELETE と ON
            UPDATE
            作用の両方をサポートします。正確な構文に関しては、項9.4.4. 「FOREIGN KEY 制約」
            を参照してください。
          
            その他のストレージエンジンに関しては、MySQL
            サーバーは CREATE
            TABLE ステートメント内の
            FOREIGN KEY と
            REFERENCES
            構文を検索し無視します。CHECK
            節は、すべてのストレージエンジンに解析されますが、無視されます。Foreign Keys
            を参照してください。
          
              ANSI/ISO SQL
              標準に精通しているユーザーの場合は、参照整合性の制約定義で使用される
              MATCH
              節を認識または適用するストレージエンジンは
              (InnoDB を含め)
              存在しないことに注意してください。
              明示的な MATCH
              節を使用しても、指定された効果はなく、また
              ON DELETE および
              ON UPDATE
              節も無視されます。これらの理由により、MATCH
              を指定することは避けてください。
            
              SQL 標準の MATCH
              節によって、主キーと比較するときに、複合
              (複合カラム) 外部キー内の
              NULL
              値がどのように処理されるかが制御されます。InnoDB
              は基本的に、外部キーをすべてまたは部分的に
              NULL
              にすることのできる、MATCH
              SIMPLE
              によって定義されたセマンティクスを実装します。その場合は、このような外部キーを含む
              (子テーブルの)
              行の挿入が許可され、その行は参照される
              (親)
              テーブル内のどの行にも一致しません。トリガーを使用して、ほかのセマンティクスを実装できます。
            
              さらに、MySQL と
              InnoDB
              では、パフォーマンスのために、参照されるカラムをインデックス設定する必要があります。ただし、システムによって、参照されるカラムを
              UNIQUE
              にするか、または NOT
              NULL
              として宣言する必要があるという要件が適用されることはありません。NULL
              値を含む一意でないキーへの外部キー参照の処理は、UPDATE
              や DELETE CASCADE
              などの操作に対して適切に定義されていません。UNIQUE
              および NOT NULL
              キーのみを参照する外部キーを使用することをお勧めします。
            
              さらに、InnoDB
              では、参照がカラム仕様の一部として定義されている
              (SQL 標準で定義された) 「インラインの
              REFERENCES
              仕様」は認識またはサポートされません。InnoDB
              は、個別の FOREIGN
              KEY
              仕様の一部として指定されている場合のみ、REFERENCES
              節を受け入れます。ほかのストレージエンジンの場合、MySQL
              サーバーは、外部キー仕様を解析して無視します。
            
パーティション化されたテーブルは外部キーをサポートしません。詳細については、Restrictions and Limitations on Partitioning を参照してください。
テーブルあたり 4096 カラムという厳しい制限がありますが、特定のテーブルでは実効的な最大数が少なくなる可能性があります。最大数は The Maximum Number of Columns Per Table で説明されている要因に依存します。
        TABLESPACE および
        STORAGE
        テーブルオプションは、どちらも MySQL 5.1.6
        で導入されました。MySQL 5.1
        では、これらのテーブルオプションは
        NDBCLUSTER
        テーブルでのみ使用されます。tablespace_name
        と名づけられたテーブル領域は
        CREATE TABLESPACE
        を利用してあらかじめ作成されている必要があります。STORAGE
        によって、使用されるストレージのタイプ
        (ディスクまたはメモリー)
        が決定され、DISK、MEMORY、DEFAULT
        のいずれかを指定できます。
      
        TABLESPACE ... STORAGE DISK
        は、MySQL Cluster
        ディスクデータテーブル領域にテーブルを割り当てます。詳細については、MySQL Cluster Disk Data Tables
        を参照してください。
      
          STORAGE
          節を、TABLESPACE
          節のない CREATE
          TABLE
          ステートメントで使用することはできません。
        
        ENGINE
        テーブルオプションはテーブルにストレージエンジンを指定します。
      
        ENGINE
        テーブルオプションは、次のテーブルに表されているストレージエンジン名を利用します。
      
| ストレージエンジン | 説明 | 
| ARCHIVE | アーカイブストレージエンジンThe ARCHIVEStorage Engine
                を参照してください。 | 
| CSV | カンマで区切られた値のフォーマットで行を格納するテーブルThe CSVStorage Engine
                を参照してください。 | 
| EXAMPLE | 例エンジンThe EXAMPLEStorage Engine
                を参照してください。 | 
| FEDERATED | リモートテーブルにアクセスするストレージエンジンThe FEDERATEDStorage Engine
                を参照してください。 | 
| HEAP | これは MEMORYの同義語です。 | 
| ISAM(OBSOLETE) | MySQL 5.1
                では使用できません。以前のバージョンから
                MySQL 5.1
                にアップグレードする場合は、アップグレードを実行する前に、既存の ISAMテーブルをすべてMyISAMに変換するようにしてください。 | 
| InnoDB | 行ロックと外部キーを持つトランザクションセーフテーブル章 9. InnoDBストレージエンジン
                を参照してください。 | 
| MEMORY | このストレージエンジンのデータはメモリーの中だけに格納されます。The MEMORY(HEAP) Storage Engine
                を参照してください。 | 
| MERGE | 1 つのテーブルとして利用される MyISAMテーブルの集まり。また、MRG_MyISAMとしても知られています。章 10.MERGEストレージエンジン
                を参照してください。 | 
| MyISAM | MySQL
                に利用されるデフォルトストレージエンジンであるバイナリポータブルストレージエンジン。The MyISAMStorage Engine
                を参照してください。 | 
| NDBCLUSTER | クラスタ化された、耐障害性の、メモリーベースのテーブル。また、 NDBとしても知られています。MySQL Cluster NDB 6.X/7.X
                を参照してください。 | 
        もし適応しないストレージエンジンが指定されると、MySQL
        は代わりにデフォルトエンジンを利用します。通常は
        MyISAM
        です。たとえば、テーブル定義が
        ENGINE=INNODB
        オプションを含み、MySQL サーバーが
        INNODB
        テーブルをサポートしなければ、そのテーブルは
        MyISAM
        テーブルとして作成されます。これにより、マスター上にはトランザクションテーブルが存在するが、スレーブ上に作成されるテーブルは
        (高速化のために)
        非トランザクションであるようなレプリケーションセットアップを実現できるようになります。
        MySQL 5.1
        では、ストレージエンジン仕様が尊重されない場合は警告が発生します。
      
        Server SQL Modes
        で説明されているように、NO_ENGINE_SUBSTITUTION
        SQL
        モードを設定することによって、エンジンの置換を制御できます。
      
          古い TYPE
          オプションは ENGINE
          と同義でした。TYPE
          は MySQL 4.0
          以降推奨されていませんが、下位互換性のために
          MySQL 5.1 (MySQL 5.1.7 を除く)
          でも引き続きサポートされています。MySQL 5.1.8
          より、警告が表示されるようになりました。MySQL
          5.4
          では、削除されています。新しいアプリケーションでは
          TYPE
          を使用しないようにしてください。また、既存のアプリケーションについては、代わりに
          ENGINE
          を使用するように変換することを今すぐ始めることをお勧めします。(詳しくは
          Changes in MySQL 5.1.8 を参照してください。)
        
        その他のテーブルオプションはテーブルの動作を最適化するために利用されます。ほとんどの場合、それらのうちのどれも指定する必要はありません。これらのオプションは、指示されないかぎりすべてのストレージエンジンに適応します。与えられたストレージエンジンに適応しないオプションは、受け入れられ、テーブル定義の一部として記憶されるでしょう。そのようなオプションは、後程もし異なるストレージエンジンの利用のためにテーブルを変換するとき
        ALTER TABLE
        を利用すれば適応されます。
      
            AUTO_INCREMENT
          
            テーブルの初期
            AUTO_INCREMENT
            値。MySQL 5.1 では、これは
            MyISAM、MEMORY、および
            InnoDB
            テーブルに対して機能します。また、MySQL
            5.1.6 では ARCHIVE
            テーブルに対しても機能します。AUTO_INCREMENT
            テーブルオプションをサポートしていないエンジンに最初の自動インクリメント値を設定するには、テーブルを作成したあと、目的の値より
            1
            小さい値を持つ「ダミー」行を挿入してから、そのダミー行を削除します。
          
            CREATE TABLE
            ステートメント内の
            AUTO_INCREMENT
            テーブルオプションをサポートするエンジンには、AUTO_INCREMENT
            値をリセットするために
            ALTER TABLE
            
            を利用することもできます。その値は、現在カラム内にある最大値よりも小さく設定することはできません。
          tbl_name AUTO_INCREMENT =
            N
            AVG_ROW_LENGTH
          
テーブルの平均行長近似値です。可変サイズ行を持つ大きいテーブルに対してのみ、これを設定する必要があります。
            MyISAM
            テーブルを作成するとき、MySQL
            はテーブルが最終的にどの程度の大きさになるのかを決めるために
            MAX_ROWS と
            AVG_ROW_LENGTH
            オプションの製品を利用します。いずれのオプションも指定しない場合、MyISAM
            データおよびインデックスファイルの最大サイズは、デフォルトで
            256TB になります。(もし使用している OS
            がその大きさのファイルをサポートしていなければ、テーブルサイズはファイルサイズ制限に制約されます)。もし大きいファイルが必要無く、インデックスを小さく早くするためにポインタサイズを小さくしたければ、myisam_data_pointer_size
            システム変数を設定することでデフォルトのポインタサイズを小さくすることができます。詳細は、Server System Variables
            を参照してください。)
            もしすべてのテーブルをデフォルトの制限よりも大きくすることを希望し、必要以上にテーブルが遅く、大きくなっても良いのであれば、この変数を設定することでデフォルトのポインタサイズを増やすことができます。この値を
            7 に設定すると、テーブルサイズが最大
            65,536TB まで可能になります。
          
            [DEFAULT] CHARACTER SET
          
            テーブルにデフォルトキャラクタセットを指定します。CHARSET
            は CHARACTER SET
            の同義語です。キャラクタセット名が
            DEFAULT
            の場合は、データベースのキャラクタセットが使用されます。
          
            CHECKSUM
          
            MySQL
            で、すべての行についてライブチェックサム
            (つまり、テーブルの変更時に MySQL
            が自動的に更新するチェックサム)
            が保持されるようにする場合は、この値を 1
            に設定します。これはテーブルの更新スピードを少し遅くしますが、壊れたテーブルを見つけるのが早くなります。CHECKSUM
            TABLE
            ステートメントはチェックサムをリポートします。(MyISAM
            のみ。)
          
            [DEFAULT] COLLATE
          
テーブルにデフォルト照合を指定します。
            COMMENT
          
最高 60 文字のテーブルに対するコメントです。
            CONNECTION
          
            FEDERATED
            テーブルの接続文字列です。
          
              旧バージョンの MySQL は、接続文字列に
              COMMENT
              オプションを使用していました。
            
            DATA
            DIRECTORY、INDEX
            DIRECTORY
          
            DATA
            DIRECTORY='
            か directory'INDEX
            DIRECTORY='
            を利用することで、directory'MyISAM
            ストレージエンジンがテーブルのデータファイルとインデックスファイルをどこに置く必要があるのかを指定することができます。ディレクトリは、ディレクトリへの
            (相対パスではなく)
            フルパス名である必要があります。
          
              MySQL 5.1.23 からは、テーブルレベルの
              DATA DIRECTORY
              および INDEX
              DIRECTORY
              オプションは、パーティション化されたテーブルでは無視されます。(Bug#32091)
            
            これらのオプションは
            --skip-symbolic-links
            オプションを利用していないときだけ機能します。OS
            にはまた、有効なスレッドセーフな
            realpath()
            コールがなければいけません。詳細については、項4.6.1.2. 「Unix 上のテーブルに対するシンボリックリンクの使用」
            をご参照ください。
          
            MyISAM テーブルが
            DATA DIRECTORY
            オプションなしで作成されている場合、.MYD
            ファイルはデータベースディレクトリ内に作成されます。このとき、MyISAM
            によって既存の
            .MYD
            ファイルが検索された場合、デフォルトではそのファイルが上書きされます。同じことが、INDEX
            DIRECTORY
            オプションなしで作成されたテーブルの
            .MYI
            ファイルにも言えます。MySQL 5.1.23
            では、この動作を抑制するには
            --keep_files_on_create
            オプションを使用してサーバーを起動します。この場合は、MyISAM
            によって既存のファイルが上書きされず、代わりにエラーが返されます。
          
            MyISAM テーブルが
            DATA DIRECTORY または
            INDEX DIRECTORY
            オプションを使用して作成されており、既存の
            .MYD または
            .MYI
            ファイルが見つかった場合、MyISAM
            は常にエラーを返します。指定されたディレクトリ内のファイルは上書きされません。
          
              MySQL 5.1.24 からは、DATA
              DIRECTORY または
              INDEX DIRECTORY に
              MySQL
              データディレクトリを含むパス名を使用できません。これには、パーティション化されたテーブルや個々のテーブルパーティションが含まれます。(Bug#32167 を参照。)
            
            DELAY_KEY_WRITE
          
            キー更新をテーブルが閉じられるときまで遅らせたければこれを
            1
            に設定してください。Server System Variables
            内の
            delay_key_write
            システム変数についての説明を参照してください。(MyISAM
            のみ。)
          
            INSERT_METHOD
          
            もしデータを MERGE
            テーブルに挿入したければ、その行が挿入されるべきテーブルの
            INSERT_METHOD
            を利用して指定する必要があります。INSERT_METHOD
            は MERGE
            テーブルにのみ有効なオプションです。最初か最後のテーブルに挿入するためには
            FIRST か
            LAST
            値を、また挿入を防ぐためには
            NO
            値を利用してください。章 10. MERGE ストレージエンジン
            を参照してください。
          
            KEY_BLOCK_SIZE
          
            このオプションは、インデックスキーブロックに使用するバイト単位のサイズに関して、ストレージエンジンにヒントを提供します。このエンジンは必要に応じて値を変更することが可能です。0
            という値は、デフォルト値を利用しなければいけないということを表しています。テーブル値を無効にするために、個々のインデックス定義はそれ自身の
            KEY_BLOCK_SIZE
            値を指定することができます。KEY_BLOCK_SIZE
            は MySQL 5.1.10 で追加されました。
          
            MAX_ROWS
          
テーブル内に格納する予定の最大行数。これは、厳しい制限というよりは、ストレージエンジンに対して、テーブルが少なくともこの程度の行数を格納できる必要があるということを表すヒントのようなものです。
            MIN_ROWS
          
            テーブル内に格納する予定の最小行数MEMORY
            ストレージエンジンは、このオプションをメモリーの使用に関するヒントとして使用します。
          
            PACK_KEYS
          
            PACK_KEYS は
            MyISAM
            テーブルとだけ効果を発揮します。小さいインデックスを持ちたければ、このオプションを
            1
            に設定してください。これは通常更新スピードを遅くし、読み込みを早くします。オプションを
            0
            に設定すると、すべてのキーパッキングが無効になります。このオプションを
            DEFAULT
            に設定すると、長い
            CHAR、VARCHAR、BINARY、または
            VARBINARY
            カラムのみをパックするようストレージエンジンに指示します。
          
            もし PACK_KEYS
            を利用しなければ、デフォルトでは文字列をパックしますが、数字はパックしません。もし
            PACK_KEYS=1
            を利用すると、数字もパックされます。
          
バイナリ数値キーをパックするとき、MySQL は接頭辞圧縮を利用します。
前のキーのいくつのバイト分が次のキーと同じであるかを示すために、すべてのキーは 1 バイト分多く必要とします。
行のポインタは、圧縮を強化するために、キーの直後に高バイト順で直接格納されます。
            これは、もし 2
            つの連続した行上に複数の同等なキーを持っていたら、すべての後続する
            「同じ」 キーは通常 2
            バイトしか利用しないということを意味します。(行のポインタを含む)
            これを、後続キーが
            storage_size_for_key +
            pointer_size
            を取る通常のケースと比べてみてください。(ポインタサイズは通常
            4)
            反対に、同じ数値を多く持つ場合のみ、接頭辞圧縮の恩恵を多いに受けることができます。もしすべてのキーがまったく異なり、NULL
            値を持つことができるキーでなければ、1
            つのキーに対してもう 1
            バイト多く利用することになります。(この場合、もしキーが
            NULL
            であれば、パックされたキー長はマークするために利用されたものと同じバイト数で格納されます)。
          
            PASSWORD
          
            このオプションは使用されません。.frm
            ファイルを暗号化してほかの MySQL
            サーバーで使用できないようにする必要がある場合は、当社の販売部門に問い合わせてください。
          
            RAID_TYPE
          
            RAID
            のサポートは、MySQL 5.0
            で削除されています。RAID
            については、CREATE TABLE Syntax
            を参照してください。
          
            ROW_FORMAT
          
            行がどのように格納されるべきかを定義します。MyISAM
            テーブルに対しては、静的、または可変長行フォーマットのオプション値は
            FIXED か
            DYNAMIC
            になり得ます。myisampack
            は型を COMPRESSED
            に設定します。MyISAM Table Storage Formats
            を参照してください。
          
            InnoDB
            テーブルに対しては、行はデフォルトでコンパクトフォーマットに格納されます。旧バージョンの
            MySQL
            で使用されていた非圧縮形式は、ROW_FORMAT=REDUNDANT
            を指定することによって引き続き要求できます。
          
              CREATE
              TABLE
              ステートメントを実行するときに、テーブルに使用されているストレージエンジンでサポートされていない行形式を指定した場合、テーブルはそのストレージエンジンのデフォルトの行形式を使用して作成されます。SHOW
              TABLE STATUS
              に応答してこのカラムで報告される情報は、使用されている実際の行形式です。作成中に元の
              CREATE
              TABLE
              定義が保持されているため、これは
              Create_options
              カラム内の値と異なっている可能性があります。
            
            UNION
          
            UNION
            は、同一の MyISAM
            テーブルの集まりを 1
            つのものとしてアクセスしたいときに利用することができます。これは
            MERGE
            テーブルとのみ機能します。章 10. MERGE ストレージエンジン
            を参照してください。
          
            MERGE
            テーブルにマップするテーブルに、SELECT、UPDATE、そして
            DELETE
            権限を持たなければいけません。
          
              以前は、使用されているすべてのテーブルが、MERGE
              テーブル自体と同じデータベース内に存在する必要がありました。この制限は適用されなくなりました。
            
        partition_options は
        CREATE TABLE
        を利用して作成されたテーブルの分割をコントロールするために利用できます。
      
          この節の最初にある
          partition_options
          の構文に示されているすべてのオプションが、すべてのパーティション分割型で使用できるとはかぎりません。テーブル作成と
          MySQL
          分割に関係するほかのステートメントの追加例だけでなく、MySQL
          内での分割の機能と使用に関しての完全な情報については、各型の情報仕様のための個別型をリストしたもの、そして
          Partitioning を見てください。
        
        使用される場合、partition_options
        節は PARTITION BY
        で始まります。この節はパーティションを決めるのに利用される関数を含んでいます。その関数は、num
        が分割数のとき、1 から num
        の整数値を返します。(テーブルに含めることのできるユーザー定義パーティションの最大数は
        1024
        です。この最大数には、この節のあとの方で説明するサブパーティションの数も含まれます。)
        MySQL 5.1
        でこの関数に使用可能な選択肢を次の一覧に示します。
      
            HASH(:行を置くためのキーを作成するために
            1
            つ、または複数のカラムをハッシュします。expr)expr
            は 1
            つ、または複数のテーブルカラムを利用する式です。これは、単一整数値を生む正当な
            MySQL 式 (MySQL 関数を含む)
            であればどれでもよいです。たとえば、これらはすべて
            PARTITION BY
            HASH を利用した有効な
            CREATE TABLE
            ステートメントです。
          
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) );
            PARTITION BY HASH
            と、VALUES LESS THAN
            や VALUES IN
            節は一緒に利用しません。
          
            PARTITION BY HASH
            はパーティション数によって分割された
            (モジュール)expr
            の残りを利用します。追加情報については
            HASH Partitioning
            を参照してください。
          
            LINEAR
            キーワードは異なるアルゴリズムを若干必要とします。l
            この場合、行が格納されるパーティション数は、1
            つ、または複数の論理的な
            AND
            操作の結果計算されます。線形ハッシングについての説明と例に関しては、LINEAR HASH Partitioning
            を参照してください。
          
            KEY(:MySQL
            がハッシング機能を均等なデータ分布を保障するために提供するという事以外、これは
            column_list)HASH
            と似ています。column_list
            引数は単にテーブルカラムのリストです。この例は、キーによって
            4
            つのパーティションに分割された単純なテーブルを表しています。
          
CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE)
    PARTITION BY KEY(col3)
    PARTITIONS 4;
            キーによって分割されたテーブルには、LINEAR
            キーワードを利用した線形分割を採用することができます。これは
            HASH
            によって分割されたテーブルと同じ効果を持ちます。これは、分割数はモジュールではなく
            &
            演算子を利用して求められるということを意味します。(詳細に関しては
            LINEAR HASH Partitioning、と
            KEY Partitioning
            を参照してください)。この例は、5
            つのパーティション間でデータを分布するためにキーによる線形分割を利用しています。
          
CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE)
    PARTITION BY LINEAR KEY(col3)
    PARTITIONS 5;
            PARTITION BY KEY
            と、VALUES LESS THAN
            や VALUES IN
            節は一緒に利用しません。
          
            RANGE:この場合、expr
            は VALUES LESS THAN
            演算子のセットを利用して値の範囲を表します。範囲の分割を利用するとき、VALUES
            LESS THAN を利用して最低 1
            つのパーティションを定義する必要があります。VALUES
            IN
            を範囲の分割に利用することはできません。
          
            VALUES LESS THAN
            はリテラル値、または単一値を評価する式のどちらかと一緒に利用することができます。
          
次のスキーマに従って、年の値を含むカラム上でパーティション化するテーブルがあるとします。
| パーティション数: | 年次範囲: | 
| 0 | 1990 以前 | 
| 1 | 1991 ~ 1994 | 
| 2 | 1995 ~ 1998 | 
| 3 | 1999 ~ 2002 | 
| 4 | 2003 ~ 2005 | 
| 5 | 2006 以降 | 
            そのような分割スキーマを実施するテーブルはここに表されている
            CREATE TABLE
            ステートメントによって実現されます。
          
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
            ...
            ステートメントは連続法で機能します。VALUES
            LESS THAN MAXVALUE
            は、指示されないかぎり、最大値よりも大きい
            「leftover」
            値を指定するために機能します。
          
            VALUES LESS THAN 節は
            switch ... case
            ブロックの case
            部分と似た方法で連続的に機能するということを覚えて置いてください。(C、Java、そして
            PHP
            等のような多くのプログラム言語内で見られるのと同じように)これは、それぞれの連続した
            VALUES LESS THAN
            内で指定された上限はその前のものよりも大きく、MAXVALUE
            に参照を付けるものがリストの一番最後に来るという方法で節を配列しなければいけない、ということを意味します。
          
            LIST(:これは州や国のコードなどのような、制限された値のセットを持つテーブルカラムに基づいたパーティションを割り当てるときに便利です。このような場合、特定の州や国に関係している行を
            1
            つのパーティションに指定したり、または、特定の州や国のセットに対してパーティションを用意しておくことができます。これは、expr)VALUES
            IN
            だけが各パーティションに許容値を指定するのに利用されるということを除いて、RANGE
            と似ています。
          
            VALUES IN
            はマッチする値のリストと共に利用されます。たとえば、次のように分割スキーマを作成することができます。
          
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)
);
            リストの分割を利用するとき、VALUES
            IN を利用して最低 1
            つのパーティションを定義する必要があります。VALUES
            LESS THAN を PARTITION
            BY LIST
            と一緒に利用することはできません。
          
              現在、VALUES IN
              で使用される値のリストは、整数値のみで構成されている必要があります。
            
            パーティションは、num
            がパーティション数である
            PARTITIONS
            
            節を利用して任意に指定されます。この節、そして
            numPARTITION
            節が両方利用されたら、num
            は PARTITION
            節を利用して宣言されたパーティションの合計数と同一でなければいけません。
          
              RANGE または
              LIST
              によってパーティション化されたテーブルを作成するときに
              PARTITIONS
              節を使用するかどうかにはかかわらず、依然として、テーブル定義に少なくとも
              1 つの PARTITION
              VALUES 節を含める必要があります
              (下を参照)。
            
            パーティションは任意でサブパーティションに分解することもあります。これは任意の
            SUBPARTITION BY
            節を利用して指示することができます。サブパーティションは
            HASH か
            KEY
            によって行われるでしょう。これらのどちらかは
            LINEAR
            でしょう。これらは、すでに説明された同等な分割の型と同じように機能します。LIST
            や RANGE
            でサブパーティションするのは不可能です)。
          
            整数値が後に続く
            SUBPARTITIONS
            キーワードを利用してサブパーティション数を指示することができます。
          
            MySQL 5.1.12
            で、PARTITIONS や
            SUBPARTITIONS
            節で利用された値の厳密な確認を紹介しています。このバージョンから、この値は次の規則を遵守します。
          
この値は、ゼロ以外の正の整数である必要があります。
ゼロが前に付いてはいけません。
                値は整数直定数である必要があり、式にはなり得ません。たとえば、0.2E+01
                が 2
                であると評価されたとしても、PARTITIONS
                0.2E+01 は許されません。(Bug#15890)
              
          PARTITION BY
          節で使用されている式
          (expr)
          は、作成されるテーブルにないカラムを参照できません。MySQL
          5.1.23
          からは、このような参照は明確に禁止され、ステートメントがエラーで失敗します。(Bug#29444)
        
        各パーティションは
        partition_definition
        節を利用して個別に定義されるでしょう。この節を形成するそれぞれの部分は次のようなものです。
      
            PARTITION
            :これはパーティションの論理名を指定します。
          partition_name
            VALUES
            節:範囲の分割に関しては、各パーティションが
            VALUES LESS THAN
            節を含む必要があり、リストの分割に関しては、各パーティションに対して
            VALUES IN
            節を指定する必要があります。これは、どの行がこのパーティションに格納されるのかということを決めるために利用されます。構文例に関しては、Partitioning
            のパーティション型に関する説明を参照してください。
          
            パーティションを説明する文字列を指定するために、オプションの
            COMMENT
            節を使用できます。例 :
          
COMMENT = 'Data for the years previous to 1999'
            DATA DIRECTORY と
            INDEX DIRECTORY
            は、このパーティションのデータとインデックスがそれぞれどこに格納されるのかを指示するために利用されます。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 と
            INDEX DIRECTORY
            は、MyISAM
            テーブルで利用される
            CREATE TABLE
            ステートメントの
            table_option
            節と同じ形で機能します。
          
各パーティションには、1 つのデータディレクトリとインデックスディレクトリが指定されます。指定されない場合、データとインデックスは、デフォルトでテーブルのデータベースディレクトリに格納されます。
            Windows では、DATA
            DIRECTORY および INDEX
            DIRECTORY
            オプションは個々のパーティションまたはサブパーティションに対してサポートされていません。MySQL
            5.1.24
            からは、警告が生成される点を除き、これらのオプションは
            Windows では無視されます。(Bug#30459)
          
              MySQL 5.1.18
              より前のバージョンでは、パーティション化されたテーブルが作成された時点で
              NO_DIR_IN_CREATE
              のサーバー SQL
              モードが有効であった場合でも、DATA
              DIRECTORY および
              INDEX DIRECTORY
              は許可されていました。MySQL 5.1.18
              からは、NO_DIR_IN_CREATE
              が有効な場合、これらのオプションはパーティション化されたテーブルを作成するときに無視されます。(Bug#24633)
            
            パーティション内に格納する行の最大、最小数をそれぞれ指定するために
            MAX_ROWS と
            MIN_ROWS
            が利用されます。max_number_of_rows
            と min_number_of_rows
            の値は正整数でなければいけません。同名のテーブルレベルオプションと同様に、これらはサーバーに対してただの
            「提案」
            として機能し、厳しい制限ではありません。
          
            任意の TABLESPACE
            節は、パーティションのテーブル領域を指定するのに利用されるでしょう。MySQL
            クラスタにのみ利用されます。
          
            パーティション分割ハンドラは、PARTITION
            と SUBPARTITION
            の両方について [STORAGE]
            ENGINE
            オプションを受け入れます。現在、この方法は、すべてのパーティションまたはすべてのサブパーティションを同じストレージエンジンに設定する場合にしか使用できず、同じテーブル内のパーティションまたはサブパーティションに異なるストレージエンジンを設定しようとするとエラーが発生します。
            ERROR 1469 (HY000): The mix of handlers in the
            partitions is not allowed in this version of
            MySQL. 将来の MySQL
            リリースでは、パーティション分割に関するこの制限を取り除く予定です。
          
            NODEGROUP
            オプションは node_group_id
            によって確認されたノードグループの一部としてこのパーティションを機能させるために利用できます。このオプションは
            MySQL クラスタに対してだけ利用可能です。
          
            パーティション定義は、1 つかそれ以上の
            subpartition_definition
            節を含みます。これらはそれぞれ、name
            が識別子のサブパーティションである
            SUBPARTITION
            
            の最小値で構成されます。nameSUBPARTITION
            を利用した PARTITION
            キーワードの入れ替え以外は、サブパーティション定義の構文はパーティション定義の構文と同一です。
          
            サブパーティションは
            HASH か
            KEY
            によって行われなけれる必要があり、そして
            RANGE か
            LIST
            パーティション上のみで行われます。Subpartitioning
            を参照してください。
          
        パーティションは修正し、マージし、テーブルに追加し、テーブルからドロップすることができます。これらのタスクを成し遂げるための基本的な
        MySQL
        ステートメントについての情報は、項8.1.7. 「ALTER TABLE 構文」
        を参照してください。更なる詳細説明や例に関しては、Partition Management
        を参照してください。
      
          元の CREATE
          TABLE ステートメント
          (すべての指定とテーブルオプションを含む)
          は、テーブルが作成されるときに MySQL
          によって格納されます。これらの情報は保持されるため、ALTER
          TABLE
          ステートメントを使用してストレージエンジン、照合、またはその他の設定を変更した場合、指定された元のテーブルオプションが保持されるようになります。これにより、2
          つのエンジンでサポートされている行形式が異なっていたとしても、InnoDB
          テーブル型と MyISAM
          テーブル型の間の変更が可能になります。
        
          元のステートメントのテキストは保持されるが、特定の値やオプション
          (ROW_FORMAT など)
          が暗黙のうちに再設定される可能性があるため、アクティブなテーブル定義
          (DESCRIBE
          または SHOW TABLE
          STATUS によってアクセス可能)
          と、テーブル作成文字列
          (SHOW CREATE
          TABLE によってアクセス可能)
          では異なる値が報告されます。
        
        CREATE TABLE
        ステートメントの最後に
        SELECT
        を追加することで、1
        つのテーブルから別のテーブルを作成することができます。
      
CREATE TABLEnew_tblSELECT * FROMorig_tbl;
        MySQL は SELECT
        内のすべての要素に対して新しいカラムを作成します。例
        :
      
mysql>CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,->PRIMARY KEY (a), KEY(b))->ENGINE=MyISAM SELECT b,c FROM test2;
        これは、これらの 3 つのカラム
        a、b、そして
        c を利用して
        MyISAM
        テーブルを作成します。SELECT
        ステートメントからのカラムは、テーブル上に重ねられるのではなくテーブルの右側に添付されることを覚えて置いてください。次の例を参考にしてください。
      
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)
        foo
        テーブル内のそれぞれの行には、foo
        からの値と新しいカラムのデフォルト値と共に
        bar
        に行が挿入されます。
      
        CREATE
        TABLE ... SELECT
        の結果出来るテーブル内では、CREATE
        TABLE
        部分の中でのみ名づけられたカラムが最初に来ます。両方で名づけられたカラムか
        SELECT
        部分の中でのみ名づけられたカラムがその後に来ます。SELECT
        カラムのデータ型は
        CREATE TABLE
        部分の中でカラムを指定することによって無効にすることもできます。
      
もしデータをテーブルにコピーしている間にエラーが発生すると、それは自動的にドロップされるので作成されません。
        CREATE
        TABLE ... SELECT
        は自動的にインデックスを作成しません。これはステートメントを可能なかぎりフレキシブルにするために意図的に行われます。もし作成したテーブルの中でインデックスを持ちたければ、SELECT
        ステートメントの前にこれらを指定しなければいけません。
      
mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
        データ型の変換が行われるかもしれません。たとえば、AUTO_INCREMENT
        属性は保管されず、VARCHAR
        カラムが CHAR
        カラムになることができます。リトレインされる属性は
        NULL (または
        NOT
        NULL)、さらにそれらの属性を含むカラムの場合は、CHARACTER
        SET、COLLATION、COMMENT、および
        DEFAULT 節です。
      
        CREATE ... SELECT
        でテーブルを作成するとき、必ずクエリーの中ではすべての関数呼び出しや式をエイリアスにしてください。もしそれをしなければ、CREATE
        ステートメントは失敗するか、望まないカラム名になってしまいます。
      
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;
発生したカラムに対して、データ型を明示的に指定することもできます。
CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM bar;
        CREATE
        TABLE ... SELECT で IF NOT
        EXISTS
        が指定され、テーブルがすでに存在する場合、MySQL
        はそのステートメントを次のように処理します。
      
            CREATE TABLE
            部分で指定されているテーブル定義は無視されます。その定義が既存のテーブルの定義に一致しない場合でも、エラーは発生しません。
          
            テーブル内のカラム数と、SELECT
            部分によって生成されたカラム数の間に不一致がある場合、選択された値は右端のカラムに割り当てられます。たとえば、テーブルに
            n
            カラムが含まれていて、SELECT
            によって m
            カラムが生成された場合
            (ここで、m <
            n)、選択された値はテーブル内の右端の
            m
            個のカラムに割り当てられます。 最初の
            n –
            m
            カラムにはそれぞれ、カラム定義で明示的に指定されたデフォルト値か、またはカラム定義にデフォルト値が含まれていない場合はカラムデータ型の暗黙のデフォルト値の、いずれかのデフォルト値が割り当てられます。
          
厳密な SQL モードが有効になっていて、これらの最初のいずれかのカラムに明示的なデフォルト値が含まれていない場合は、ステートメントがエラーで失敗します。
        次の例は、IF NOT EXISTS
        の処理を示しています。
      
mysql>CREATE TABLE t1 (i1 INT DEFAULT 0, i2 INT, i3 INT, i4 INT);Query OK, 0 rows affected (0.05 sec) mysql>CREATE TABLE IF NOT EXISTS t1 (c1 CHAR(10)) SELECT 1, 2;Query OK, 1 row affected, 1 warning (0.01 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql>SELECT * FROM t1;+------+------+------+------+ | i1 | i2 | i3 | i4 | +------+------+------+------+ | 0 | NULL | 1 | 2 | +------+------+------+------+ 1 row in set (0.00 sec)
        元テーブルの中で指定されたカラム属性やインデックスを含む、ほかのテーブルの定義に基づき空のテーブルを作成するには、LIKE
        を利用してください。
      
CREATE TABLEnew_tblLIKEorig_tbl;
        コピーは元テーブルと同じバージョンのテーブルストレージフォーマットを利用して作成されます。元のテーブルには
        SELECT
        権限が必要です。
      
        LIKE
        は、ビューに対してではなく、ベーステーブルに対してのみ機能します。
      
        CREATE TABLE ... LIKE
        は、元テーブルに対して、または外部キー定義に対して指示された
        DATA DIRECTORY や
        INDEX DIRECTORY
        テーブルオプションを保管しません。
      
        ユニークキー値を複製する行をどのように扱うかを指示するために、IGNORE
        か REPLACE によって
        SELECT
        を先行させることができます。IGNORE
        利用すると、ユニークキー値上に既存の行を複製する新しい行は廃棄されます。REPLACE
        を利用すると、新しい行は同じユニークキー値を持つ行を置き換えます。もし
        IGNORE も
        REPLACE
        も指示されなければ、複製ユニークキー値はエラーになります。
      
        バイナリログが元テーブルを再作成するために利用できることを保障するために、MySQL
        は
        CREATE
        TABLE ... SELECT
        の最中の並列挿入を許可しません。
      

