このページは機械翻訳したものです。
- 13.1.20.1 CREATE TABLE によって作成されるファイル
- 13.1.20.2 CREATE TEMPORARY TABLE ステートメント
- 13.1.20.3 CREATE TABLE ... LIKE ステートメント
- 13.1.20.4 CREATE TABLE ... SELECT ステートメント
- 13.1.20.5 FOREIGN KEY の制約
- 13.1.20.6 CHECK 制約
- 13.1.20.7 暗黙のカラム指定の変更
- 13.1.20.8 CREATE TABLE および生成されるカラム
- 13.1.20.9 セカンダリインデックスと生成されたカラム
- 13.1.20.10 非表示カラム
- 13.1.20.11 NDB_TABLE オプションの設定
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]
[IGNORE | REPLACE]
[AS] query_expression
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{ LIKE old_tbl_name | (LIKE old_tbl_name) }
create_definition: {
col_name column_definition
| {INDEX | KEY} [index_name] [index_type] (key_part,...)
[index_option] ...
| {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name] (key_part,...)
[index_option] ...
| [CONSTRAINT [symbol]] PRIMARY KEY
[index_type] (key_part,...)
[index_option] ...
| [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]
[index_name] [index_type] (key_part,...)
[index_option] ...
| [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (col_name,...)
reference_definition
| check_constraint_definition
}
column_definition: {
data_type [NOT NULL | NULL] [DEFAULT {literal | (expr)} ]
[VISIBLE | INVISIBLE]
[AUTO_INCREMENT] [UNIQUE [KEY]] [[PRIMARY] KEY]
[COMMENT 'string']
[COLLATE collation_name]
[COLUMN_FORMAT {FIXED | DYNAMIC | DEFAULT}]
[ENGINE_ATTRIBUTE [=] 'string']
[SECONDARY_ENGINE_ATTRIBUTE [=] 'string']
[STORAGE {DISK | MEMORY}]
[reference_definition]
[check_constraint_definition]
| data_type
[COLLATE collation_name]
[GENERATED ALWAYS] AS (expr)
[VIRTUAL | STORED] [NOT NULL | NULL]
[VISIBLE | INVISIBLE]
[UNIQUE [KEY]] [[PRIMARY] KEY]
[COMMENT 'string']
[reference_definition]
[check_constraint_definition]
}
data_type:
(see 第11章「データ型」)
key_part: {col_name [(length)] | (expr)} [ASC | DESC]
index_type:
USING {BTREE | HASH}
index_option: {
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT 'string'
| {VISIBLE | INVISIBLE}
|ENGINE_ATTRIBUTE [=] 'string'
|SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
}
check_constraint_definition:
[CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]
reference_definition:
REFERENCES tbl_name (key_part,...)
[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
table_options:
table_option [[,] table_option] ...
table_option: {
AUTOEXTEND_SIZE [=] value
| AUTO_INCREMENT [=] value
| AVG_ROW_LENGTH [=] value
| [DEFAULT] CHARACTER SET [=] charset_name
| CHECKSUM [=] {0 | 1}
| [DEFAULT] COLLATE [=] collation_name
| COMMENT [=] 'string'
| COMPRESSION [=] {'ZLIB' | 'LZ4' | 'NONE'}
| CONNECTION [=] 'connect_string'
| {DATA | INDEX} DIRECTORY [=] 'absolute path to directory'
| DELAY_KEY_WRITE [=] {0 | 1}
| ENCRYPTION [=] {'Y' | 'N'}
| ENGINE [=] engine_name
| ENGINE_ATTRIBUTE [=] 'string'
| 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}
| SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
| STATS_AUTO_RECALC [=] {DEFAULT | 0 | 1}
| STATS_PERSISTENT [=] {DEFAULT | 0 | 1}
| STATS_SAMPLE_PAGES [=] value
| TABLESPACE tablespace_name [STORAGE {DISK | MEMORY}]
| UNION [=] (tbl_name[,tbl_name]...)
}
partition_options:
PARTITION BY
{ [LINEAR] HASH(expr)
| [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list)
| RANGE{(expr) | COLUMNS(column_list)}
| LIST{(expr) | COLUMNS(column_list)} }
[PARTITIONS num]
[SUBPARTITION BY
{ [LINEAR] HASH(expr)
| [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list) }
[SUBPARTITIONS num]
]
[(partition_definition [, partition_definition] ...)]
partition_definition:
PARTITION partition_name
[VALUES
{LESS THAN {(expr | value_list) | MAXVALUE}
|
IN (value_list)}]
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'string' ]
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]
[(subpartition_definition [, subpartition_definition] ...)]
subpartition_definition:
SUBPARTITION logical_name
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'string' ]
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]
query_expression:
SELECT ... (Some valid select or union statement)
CREATE TABLE は、指定された名前を持つテーブルを作成します。 このテーブルに対する CREATE 権限が必要です。
デフォルトでは、テーブルは InnoDB ストレージエンジンを使用してデフォルトデータベースに作成されます。 テーブルがすでに存在する場合、デフォルトデータベースが存在しない場合、またはデータベースが存在しない場合はエラーが発生します。
MySQL にはテーブル数の制限はありません。 ベースとなるファイルシステムによっては、テーブルを表すファイル数に制限がある場合があります。 個々のストレージエンジンには、エンジン固有の制約が課される場合があります。 InnoDB では、最大 40 億個のテーブルを使用できます。
テーブルの物理表現の詳細は、セクション13.1.20.1「CREATE TABLE によって作成されるファイル」 を参照してください。
このセクションの次のトピックで説明するように、CREATE TABLE ステートメントにはいくつかの側面があります:
テーブル名
-
tbl_name特定のデータベース内にテーブルを作成するには、テーブル名を
db_name.tbl_nameとして指定できます。 そのデータベースが存在すると仮定すると、これは、デフォルトデータベースが存在するかどうかには関係なく機能します。 引用符で囲まれた識別子を使用する場合は、データベース名とテーブル名を個別に引用符で囲みます。 たとえば、`mydb.mytbl`ではなく、`mydb`.`mytbl`と記述します。許可されるテーブル名のルールは、セクション9.2「スキーマオブジェクト名」に示されています。
-
IF NOT EXISTSテーブルが存在する場合にエラーが発生しないようにします。 ただし、既存のテーブルの構造が
CREATE TABLEステートメントによって示されている構造と同一であることの検証は行われません。
一時テーブル
テーブルの作成時に TEMPORARY キーワードを使用できます。 TEMPORARY テーブルは現在のセッション内でのみ表示され、セッションがクローズされると自動的に削除されます。 詳細は、セクション13.1.20.2「CREATE TEMPORARY TABLE ステートメント」を参照してください。
テーブルのクローニングおよびコピー
-
LIKECREATE TABLE ... LIKEを使用して、元のテーブルに定義されているカラム属性やインデックスなど、別のテーブルの定義に基づいて空のテーブルを作成します:CREATE TABLE new_tbl LIKE orig_tbl;詳細は、セクション13.1.20.3「CREATE TABLE ... LIKE ステートメント」を参照してください。
-
[AS]query_expression別のテーブルからテーブルを作成するには、
CREATE TABLEステートメントの最後にSELECTステートメントを追加します:CREATE TABLE new_tbl AS SELECT * FROM orig_tbl;詳細は、セクション13.1.20.4「CREATE TABLE ... SELECT ステートメント」を参照してください。
-
IGNORE | REPLACEIGNOREおよびREPLACEオプションは、SELECTステートメントを使用してテーブルをコピーするときに一意キー値を複製する行の処理方法を示します。詳細は、セクション13.1.20.4「CREATE TABLE ... SELECT ステートメント」を参照してください。
カラムのデータ型および属性
テーブルあたり 4096 カラムという強い制限値がありますが、特定のテーブルでは、実際の最大数がこれより少なくなる可能性があります。実際の最大数は、セクション8.4.7「テーブルカラム数と行サイズの制限」で説明されている要因によって異なります。
-
data_typedata_typeは、カラム定義のデータ型を表します。 カラムのデータ型の指定に使用できる構文の詳細、および各型のプロパティの詳細は、第11章「データ型」 を参照してください。属性の中には、すべてのデータ型には適用されないものがあります。
AUTO_INCREMENTは、整数型と浮動小数点型にのみ適用されます。 MySQL 8.0.13 より前は、DEFAULTはBLOB,TEXT,GEOMETRYおよびJSONタイプには適用されません。-
文字データ型 (
CHAR、VARCHAR、TEXT型、ENUM、SETおよびシノニム) には、CHARACTER SETを含めてカラムの文字セットを指定できます。CHARSETはCHARACTER SETのシノニムです。 文字セットの照合順序は、他の属性とともにCOLLATE属性とともに指定できます。 詳細は、第10章「文字セット、照合順序、Unicode」を参照してください。 例:CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);MySQL 8.0 は、文字カラム定義内の長さの指定を文字数で解釈します。
BINARYとVARBINARYの長さはバイト単位です。 -
CHAR、VARCHAR、BINARY、およびVARBINARYカラムの場合は、構文を使用してインデックスプリフィクス長を指定することにより、カラム値の先頭の部分のみを使用するインデックスを作成できます。col_name(length)BLOBおよびTEXTカラムにもインデックスを設定できますが、プリフィクス長を指定する必要があります。 プリフィクス長は、バイナリ以外の文字列型の場合は文字数で、バイナリ文字列型の場合はバイト単位で指定されます。 つまり、インデックスエントリは、CHAR、VARCHAR、およびTEXTカラムの場合は各カラム値の最初のlength文字、BINARY、VARBINARY、およびBLOBカラムの場合は各カラム値の最初のlengthバイトで構成されます。 このようにカラム値のプリフィクスのみにインデックスを設定すると、インデックスファイルをはるかに小さくできます。 インデックス接頭辞の詳細は、セクション13.1.15「CREATE INDEX ステートメント」 を参照してください。BLOBおよびTEXTカラム上のインデックス設定をサポートするのは、InnoDBおよびMyISAMストレージエンジンだけです。 例:CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));指定したインデックス接頭辞がカラムの最大データ型サイズを超える場合、
CREATE TABLEは次のようにインデックスを処理します:一意でないインデックスの場合は、エラーが発生するか (厳密な SQL モードが有効な場合)、インデックスの長さが最大カラムデータ型サイズ内になるように縮小され、警告が生成されます (厳密な SQL モードが有効でない場合)。
一意インデックスの場合、インデックスの長さを短くすると、指定した一意性要件を満たさない一意でないエントリの挿入が可能になるため、SQL モードに関係なくエラーが発生します。
JSONカラムはインデックス付けできません。 この制限を回避するには、生成されたカラムにJSONカラムからスカラー値を抽出するインデックスを作成します。 詳細な例は、JSON カラムインデックスを提供するための生成されたカラムのインデックス付け を参照してください。
-
NOT NULL | NULLNULLとNOT NULLのどちらも指定されていない場合、そのカラムはNULLが指定されたかのように処理されます。MySQL 8.0 では、
InnoDB、MyISAMおよびMEMORYストレージエンジンのみがNULL値を持つことができるカラムのインデックスをサポートしています。 それ以外の場合は、インデックス付きカラムをNOT NULLとして宣言する必要があります。そうしないと、エラー結果が発生します。 -
DEFAULTカラムのデフォルト値を指定します。 カラム定義に明示的な
DEFAULT値が含まれていない場合など、デフォルト値の処理の詳細は、セクション11.6「データ型デフォルト値」 を参照してください。NO_ZERO_DATEまたはNO_ZERO_IN_DATESQL モードが有効になっているときに、日付の値のデフォルトがそのモードに従って正しくない場合、CREATE TABLEでは厳密な SQL モードが有効になっていない場合は警告を、厳密モードが有効になっている場合はエラーを生成します。 たとえば、NO_ZERO_IN_DATEが有効になっている場合は、c1 DATE DEFAULT '2010-00-00'によって警告が生成されます。 -
VISIBLE,INVISIBLEカラムの可視性を指定します。 どちらのキーワードも存在しない場合、デフォルトは
VISIBLEです。 テーブルには、少なくとも 1 つの表示可能なカラムが必要です。 すべてのカラムを非表示にしようとすると、エラーが発生します。 詳細は、セクション13.1.20.10「非表示カラム」を参照してください。VISIBLEおよびINVISIBLEキーワードは、MySQL 8.0.23 の時点で使用できます。 MySQL 8.0.23 より前は、すべてのカラムが表示されます。 -
AUTO_INCREMENT整数または浮動小数点のカラムには、追加の属性
AUTO_INCREMENTを指定できます。 インデックスが設定されたAUTO_INCREMENTカラムにNULL(推奨) または0の値を挿入すると、カラムは次のシーケンス値に設定されます。 通常、これはです。ここでvalue+1valueは現在テーブルにあるカラムの最大値です。AUTO_INCREMENTシーケンスは1で始まります。行を挿入したあとに
AUTO_INCREMENT値を取得するには、LAST_INSERT_ID()SQL 関数またはmysql_insert_id()C API 関数を使用します。 セクション12.16「情報関数」およびmysql_insert_id()を参照してください。NO_AUTO_VALUE_ON_ZEROSQL モードが有効になっている場合は、新しいシーケンス値を生成することなく、0をAUTO_INCREMENTカラム内に0として格納できます。 セクション5.1.11「サーバー SQL モード」を参照してください。テーブルごとに存在できる
AUTO_INCREMENTカラムは 1 つだけです。このカラムはインデックス付きである必要があり、DEFAULT値を割り当てることはできません。AUTO_INCREMENTカラムは、正の値だけが含まれている場合にのみ正しく機能します。 負の数を挿入すると、非常に大きな正の数を挿入したと見なされます。 これは、数字が正から負に「ラップする」ときの精度の問題を回避すると同時に、0を含むAUTO_INCREMENTカラムを誤って取得してしまわないようにするために行われます。MyISAMテーブルの場合は、マルチカラムキー内のAUTO_INCREMENTセカンダリカラムを指定できます。 セクション3.6.9「AUTO_INCREMENT の使用」を参照してください。MySQL を一部の ODBC アプリケーションと互換性があるようにするために、次のクエリーを使用して、最後に挿入された行の
AUTO_INCREMENT値を見つけることができます。SELECT * FROM tbl_name WHERE auto_col IS NULLこのメソッドでは、
sql_auto_is_null変数が 0 に設定されていない必要があります。 セクション5.1.8「サーバーシステム変数」を参照してください。InnoDBとAUTO_INCREMENTについては、セクション15.6.1.6「InnoDB での AUTO_INCREMENT 処理」を参照してください。AUTO_INCREMENTと MySQL レプリケーションについては、セクション17.5.1.1「レプリケーションと AUTO_INCREMENT」を参照してください。 -
COMMENTカラムのコメントは、
COMMENTオプションで 1024 文字以内で指定できます。 このコメントは、SHOW CREATE TABLEおよびSHOW FULL COLUMNSステートメントによって表示されます。 -
COLUMN_FORMATNDB Cluster では、
COLUMN_FORMATを使用してNDBテーブルの個々のカラムのデータストレージ形式を指定することもできます。 許可されるカラムフォーマットは、FIXED、DYNAMIC、およびDEFAULTです。FIXEDは固定幅記憶域の指定に使用され、DYNAMICはカラムを可変幅にすることを許可し、DEFAULTはカラムのデータ型によって決定される固定幅記憶域または可変幅記憶域 (ROW_FORMAT指定子によってオーバーライドされる可能性がある) を使用します。NDBテーブルの場合、COLUMN_FORMATのデフォルト値はFIXEDです。NDB Cluster では、
COLUMN_FORMAT=FIXEDで定義されたカラムの可能な最大オフセットは 8188 バイトです。 詳細および考えられる回避策については、セクション23.1.7.5「NDB Cluster 内のデータベースオブジェクトに関連付けられる制限」 を参照してください。COLUMN_FORMATは現在、NDB以外のストレージエンジンを使用しているテーブルのカラムには影響を与えません。 MySQL 8.0 は、COLUMN_FORMATを暗黙的に無視します。 -
ENGINE_ATTRIBUTEおよびSECONDARY_ENGINE_ATTRIBUTEオプション (MySQL 8.0.21 の時点で使用可能) を使用して、プライマリおよびセカンダリストレージエンジンのカラム属性を指定します。 オプションは、将来の使用のために予約されています。許可される値は、有効な
JSONドキュメントまたは空の文字列 ('') を含む文字列リテラルです。 無効なJSONが拒否されました。CREATE TABLE t1 (c1 INT ENGINE_ATTRIBUTE='{"key":"value"}');ENGINE_ATTRIBUTEおよびSECONDARY_ENGINE_ATTRIBUTEの値は、エラーなしで繰り返すことができます。 この場合、最後に指定した値が使用されます。ENGINE_ATTRIBUTEおよびSECONDARY_ENGINE_ATTRIBUTEの値は、サーバーによってチェックされず、テーブルストレージエンジンが変更されたときにもクリアされません。 -
STORAGENDBテーブルの場合、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以外のストレージエンジンを使用しているテーブルには影響を与えません。STORAGEキーワードは NDB Cluster で提供される mysqld の構築でのみサポートされます。ほかのバージョンの MySQL では認識されず、STORAGEキーワードを使用しようとすると構文エラーが発生します。 -
GENERATED ALWAYS生成されたカラム式を指定するために使用します。 generated columns の詳細は、セクション13.1.20.8「CREATE TABLE および生成されるカラム」 を参照してください。
Stored generated columns はインデックス付けできます。
InnoDBは、virtual generated columns でセカンダリインデックスをサポートしています。 セクション13.1.20.9「セカンダリインデックスと生成されたカラム」を参照してください。
インデックス、外部キーおよび CHECK 制約
インデックス、外部キーおよび CHECK 制約の作成には、いくつかのキーワードが適用されます。 次の説明に加えて、一般的な背景は、セクション13.1.15「CREATE INDEX ステートメント」、セクション13.1.20.5「FOREIGN KEY の制約」 および セクション13.1.20.6「CHECK 制約」 を参照してください。
-
CONSTRAINTsymbolCONSTRAINT句を指定して制約に名前を付けることができます。 句が指定されていない場合、またはsymbolCONSTRAINTキーワードの後にsymbolが含まれていない場合、MySQL では制約名が自動的に生成されますが、次に示す例外があります。symbol値 (使用する場合) は、制約タイプごとにスキーマ (データベース) ごとに一意である必要があります。symbolが重複すると、エラーになります。 セクション9.2.1「識別子の長さ制限」 で生成される制約識別子の長さ制限に関する説明も参照してください。注記外部キー定義に
CONSTRAINT句が指定されていない場合、またはsymbolCONSTRAINTキーワードの後にsymbolが含まれていない場合、MySQL は MySQL 8.0.15 までの外部キーインデックス名を使用し、その後に制約名を自動的に生成します。SQL 標準では、すべてのタイプの制約 (主キー、一意インデックス、外部キー、チェック) が同じネームスペースに属することが指定されています。 MySQL では、各制約タイプにスキーマごとに独自のネームスペースがあります。 したがって、各タイプの制約の名前はスキーマごとに一意である必要がありますが、異なるタイプの制約には同じ名前を付けることができます。
-
PRIMARY KEYすべてのキーカラムを
NOT NULLとして定義する必要がある一意のインデックス。 それらがNOT NULLとして明示的に宣言されていない場合、MySQL は、それらを暗黙的に (かつ警告なしで) そのように宣言します。 テーブルに存在できるPRIMARY KEYは 1 つだけです。PRIMARY KEYの名前は、常にPRIMARYです。そのため、これをその他のどの種類のインデックスの名前としても使用できません。PRIMARY KEYが存在しないときに、アプリケーションがテーブル内のPRIMARY KEYを要求した場合、MySQL は、NULLカラムのない最初のUNIQUEインデックスをPRIMARY KEYとして返します。InnoDBテーブルでは、セカンダリインデックスのためのストレージのオーバーヘッドを最小限に抑えるために、PRIMARY KEYを短い値に維持してください。 各セカンダリインデックスエントリには、対応する行の主キーカラムのコピーが含まれています。 (セクション15.6.2.1「クラスタインデックスとセカンダリインデックス」を参照してください。)作成されたテーブルでは、
PRIMARY KEYが最初に配置され、そのあとにすべてのUNIQUEインデックス、さらに一意でないインデックスが続きます。 これは、MySQL オプティマイザが、使用するインデックスに優先順位を付けたり、重複したUNIQUEキーをよりすばやく検出したりするのに役立ちます。PRIMARY KEYをマルチカラムインデックスにすることができます。 ただし、カラム指定でPRIMARY KEYキー属性を使用してマルチカラムインデックスを作成することはできません。 それを行なっても、その単一カラムがプライマリとしてマークされるだけです。 別のPRIMARY KEY(句を使用する必要があります。key_part, ...)テーブルに整数型の単一カラムで構成される
PRIMARY KEYまたはUNIQUE NOT NULLインデックスがある場合、一意インデックス で説明されているように、_rowidを使用してSELECTステートメントのインデックス付きカラムを参照できます。MySQL では、
PRIMARY KEYの名前はPRIMARYです。 その他のインデックスでは、名前を割り当てなかった場合、そのインデックスには最初のインデックス付きカラムと同じ名前が割り当てられ、それを一意にするためにオプションのサフィクス (_2、_3、...) が付けられます。 テーブルのインデックス名は、SHOW INDEX FROMを使用して確認できます。 セクション13.7.7.22「SHOW INDEX ステートメント」を参照してください。tbl_name -
KEY | INDEXKEYは通常、INDEXのシノニムです。 キー属性PRIMARY KEYもまた、カラム定義内で指定する場合は、単にKEYとして指定できます。 これは、ほかのデータベースシステムとの互換性のために実装されました。 -
UNIQUEUNIQUEインデックスは、そのインデックス内のすべての値が異なっている必要があるという制約を作成します。 既存の行に一致するキー値を持つ新しい行を追加しようとすると、エラーが発生します。 すべてのエンジンについて、UNIQUEインデックスは、NULLを含むことができるカラムでの複数のNULL値を許可します。UNIQUEインデックスのカラムに接頭辞値を指定する場合、カラム値は接頭辞の長さ内で一意である必要があります。テーブルに整数型の単一カラムで構成される
PRIMARY KEYまたはUNIQUE NOT NULLインデックスがある場合、一意インデックス で説明されているように、_rowidを使用してSELECTステートメントのインデックス付きカラムを参照できます。 -
FULLTEXTFULLTEXTインデックスは、全文検索に使用される特別なタイプのインデックスです。FULLTEXTインデックスをサポートするのは、InnoDBおよびMyISAMだけです。 これらは、CHAR、VARCHAR、およびTEXTカラムからのみ作成できます。 インデックス設定は常に、カラム全体に対して実行されます。カラムプリフィクスのインデックス設定はサポートされていないため、プリフィクス長が指定されてもすべて無視されます。 操作の詳細は、セクション12.10「全文検索関数」を参照してください。WITH PARSER句は、全文インデックス設定および検索操作に特殊な処理が必要な場合にパーサープラグインをインデックスに関連付けるために、index_option値として指定できます。 この句は、FULLTEXTインデックスに対してのみ有効です。InnoDBおよびMyISAMは、フルテキストパーサープラグインをサポートしています。 詳細は、Full-Text Parser Plugins および Writing Full-Text Parser Plugins を参照してください。 -
SPATIAL空間データ型に
SPATIALインデックスを作成できます。 空間型はInnoDBおよびMyISAMテーブルでのみサポートされており、インデックス付けされたカラムはNOT NULLとして宣言する必要があります。 セクション11.4「空間データ型」を参照してください。 -
FOREIGN KEYMySQL は、関連データのテーブルにまたがる相互参照を可能にする外部キーと、この分散したデータの整合性を維持するために役立つ外部キー制約をサポートします。 定義およびオプションの情報は、
reference_definitionおよびreference_optionを参照してください。InnoDBストレージエンジンを使用するパーティション化されたテーブルは、外部キーをサポートしていません。 詳細については、セクション24.6「パーティショニングの制約と制限」を参照してください。 -
CHECKCHECK句を使用すると、テーブルの行のデータ値について制約を作成できます。 セクション13.1.20.6「CHECK 制約」を参照してください。 -
key_partkey_part仕様の末尾には、ASCまたはDESCを使用して、インデックス値を昇順または降順のどちらで格納するかを指定できます。 順序指定子が指定されていない場合、デフォルトは昇順です。-
length属性で定義される接頭辞の長さは、REDUNDANTまたはCOMPACTの行形式を使用するInnoDBテーブルでは最大 767 バイトです。DYNAMICまたはCOMPRESSEDの行形式を使用するInnoDBテーブルでは、接頭辞の長さの制限は 3072 バイトです。MyISAMテーブルの場合、接頭辞の長さの制限は 1000 バイトです。接頭辞 limits はバイト単位で測定されます。 ただし、
CREATE TABLE、ALTER TABLEおよびCREATE INDEXステートメントのインデックス指定の接頭辞 lengths は、非バイナリ文字列型 (CHAR,VARCHAR,TEXT) の場合は文字数として解釈され、バイナリ文字列型 (BINARY,VARBINARY,BLOB) の場合はバイト数として解釈されます。 マルチバイト文字セットを使用する非バイナリ文字列カラムに接頭辞の長さを指定する場合は、これを考慮してください。 MySQL 8.0.17 以降、
key_part仕様のexprでは、(CASTの形式を使用してjson_pathAStypeARRAY)JSONカラムに複数値インデックスを作成できます。複数値インデックス では、複数値インデックスの作成、使用方法、制限および制限に関する詳細情報を提供します。
-
index_type一部のストレージエンジンでは、インデックスの作成時にインデックスタイプを指定できます。
index_type指定子の構文は、USINGです。type_name例:
CREATE TABLE lookup (id INT, INDEX USING BTREE (id)) ENGINE = MEMORY;USINGの推奨される位置は、インデックスカラムリストのあとです。 カラムリストの前に指定できますが、その位置でのオプションの使用のサポートは非推奨であるため、将来の MySQL リリースで削除される予定です。 -
index_optionindex_option値は、インデックスの追加オプションを指定します。-
KEY_BLOCK_SIZEMyISAMテーブルの場合、KEY_BLOCK_SIZEはオプションで、インデックスキーブロックに使用するサイズをバイト単位で指定します。 この値はヒントとして扱われます。必要に応じて、異なるサイズが使用される可能性があります。 個々のインデックス定義に指定されたKEY_BLOCK_SIZE値は、テーブルレベルのKEY_BLOCK_SIZE値をオーバーライドします。テーブルレベルの
KEY_BLOCK_SIZE属性の詳細は、テーブルオプション を参照してください。 -
WITH PARSERWITH PARSERオプションは、FULLTEXTインデックスでのみ使用できます。 これは、全文インデックス設定および検索操作に特殊な処理が必要な場合に、パーサープラグインをインデックスに関連付けます。InnoDBおよびMyISAMは、フルテキストパーサープラグインをサポートしています。 フルテキストパーサープラグインが関連付けられたMyISAMテーブルがある場合は、ALTER TABLEを使用してテーブルをInnoDBに変換できます。 -
COMMENTインデックス定義には、最大 1024 文字のオプションのコメントを含めることができます。
index_optionCOMMENT句を使用して、個々のインデックスにInnoDBMERGE_THRESHOLD値を設定できます。 セクション15.8.11「インデックスページのマージしきい値の構成」を参照してください。 -
VISIBLE,INVISIBLEインデックスの可視性を指定します。 インデックスはデフォルトで可視化されます。 不可視インデックスはオプティマイザでは使用されません。 インデックスの可視性の指定は、主キー以外のインデックス (明示的または暗黙的) に適用されます。 詳細は、セクション8.3.12「不可視のインデックス」を参照してください。
ENGINE_ATTRIBUTEおよびSECONDARY_ENGINE_ATTRIBUTEオプション (MySQL 8.0.21 の時点で使用可能) は、プライマリストレージエンジンおよびセカンダリストレージエンジンのインデックス属性を指定するために使用されます。 オプションは、将来の使用のために予約されています。
許容される
index_option値の詳細は、セクション13.1.15「CREATE INDEX ステートメント」 を参照してください。 インデックスの詳細は、セクション8.3.1「MySQL のインデックスの使用の仕組み」を参照してください。 -
-
reference_definition構文の詳細および例は、セクション13.1.20.5「FOREIGN KEY の制約」 を参照してください。InnoDBおよびNDBテーブルは、外部キー制約のチェックをサポートしています。 参照されるテーブルのカラムには、常に明示的に名前を付ける必要があります。 外部キーに対してはON DELETEとON UPDATEの両方のアクションがサポートされています。 詳細および例については、セクション13.1.20.5「FOREIGN KEY の制約」を参照してください。その他のストレージエンジンの場合、MySQL Server は、
CREATE TABLEステートメント内のFOREIGN KEYおよびREFERENCES構文を解析して無視します。 セクション1.7.2.3「FOREIGN KEY 制約の違い」を参照してください。重要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(またはPRIMARY) とNOT NULLの両方であるキーのみを参照する外部キーを使用することをお勧めします。MySQL は、参照がカラム指定の一部として定義されている「「インライン
REFERENCES仕様」」 (SQL 標準で定義されているもの) を解析しますが、無視します。 MySQL は、個別のFOREIGN KEY指定の一部として指定されている場合にのみREFERENCES句を受け入れます。 -
RESTRICT,CASCADE,SET NULL,NO ACTIONおよびSET DEFAULTオプションの詳細は、セクション13.1.20.5「FOREIGN KEY の制約」 を参照してください。
テーブルオプション
テーブルオプションは、テーブルの動作を最適化するために使用します。 ほとんどの場合は、それらのうちのどれも指定する必要はありません。 特に示されていないかぎり、これらのオプションはすべてのストレージエンジンに適用されます。 特定のストレージエンジンに適用されないオプションは、テーブル定義の一部として受け入れられ、記憶される可能性があります。 それにより、あとで ALTER TABLE を使用して、別のストレージエンジンを使用するようにテーブルを変換した場合に、このようなオプションが適用されます。
-
ENGINE次のテーブルに示すいずれかの名前を使用して、テーブルのストレージエンジンを指定します。 エンジン名は、引用符で囲んでも囲まなくてもかまいません。 引用符で囲まれた名前
'DEFAULT'は認識されますが、無視されます。ストレージエンジン 説明 InnoDB行ロックと外部キーを備えたトランザクションセーフテーブル。 新しいテーブルのためのデフォルトのストレージエンジン。 MySQL は経験しているが、 InnoDBがはじめてである場合は、第15章「InnoDB ストレージエンジン」、そのなかでも特にセクション15.1「InnoDB 入門」を参照してください。MyISAM主に読み取り専用または読み取りが大半のワークロードに使用される、バイナリの移植可能なストレージエンジン。 セクション16.2「MyISAM ストレージエンジン」を参照してください。 MEMORYこのストレージエンジンのデータは、メモリー内にのみ格納されます。 セクション16.3「MEMORY ストレージエンジン」を参照してください。 CSVカンマ区切り値形式で行を格納するテーブル。 セクション16.4「CSV ストレージエンジン」を参照してください。 ARCHIVEアーカイブストレージエンジン。 セクション16.5「ARCHIVE ストレージエンジン」を参照してください。 EXAMPLEサンプルのエンジン。 セクション16.9「EXAMPLE ストレージエンジン」を参照してください。 FEDERATEDリモートテーブルにアクセスするストレージエンジン。 セクション16.8「FEDERATED ストレージエンジン」を参照してください。 HEAPこれは MEMORYのシノニムです。MERGE1 つのテーブルとして使用される MyISAMテーブルのコレクション。MRG_MyISAMとも呼ばれます。 セクション16.7「MERGE ストレージエンジン」を参照してください。NDBトランザクションと外部キーをサポートする、クラスタ化された、耐障害の、メモリーベースのテーブル。 NDBCLUSTERとも呼ばれます。 第23章「MySQL NDB Cluster 8.0」を参照してください。デフォルトでは、使用できないストレージエンジンが指定されている場合、ステートメントはエラーで失敗します。 この動作をオーバーライドするには、サーバーの SQL モードから
NO_ENGINE_SUBSTITUTIONを削除します (セクション5.1.11「サーバー SQL モード」 を参照)。これにより、MySQL では、指定されたエンジンをデフォルトのストレージエンジンに置き換えることができます。 通常、このような場合、これはdefault_storage_engineシステム変数のデフォルト値であるInnoDBです。NO_ENGINE_SUBSTITUTIONが無効になっている場合、ストレージエンジンの指定が受け入れられないと警告が発生します。 -
AUTOEXTEND_SIZEテーブルスペースが一杯になったときに
InnoDBがテーブルスペースのサイズを拡張する量を定義します。 MySQL 8.0.23 で導入されました。 設定は 4MB の倍数である必要があります。 デフォルト設定は 0 で、暗黙的なデフォルト動作に従ってテーブルスペースが拡張されます。 詳細は、セクション15.6.3.9「テーブルスペースの AUTOEXTEND_SIZE 構成」を参照してください。 -
AUTO_INCREMENTテーブルの初期の
AUTO_INCREMENT値。 MySQL 8.0 では、これはMyISAM、MEMORY、InnoDB、およびARCHIVEテーブルに対して機能します。AUTO_INCREMENTテーブルオプションをサポートしていないエンジンの最初の自動インクリメント値を設定するには、テーブルを作成したあとに目的の値より 1 小さい値を持つ「ダミーの」行を挿入してから、そのダミーの行を削除します。CREATE TABLEステートメント内のAUTO_INCREMENTテーブルオプションをサポートするエンジンの場合は、ALTER TABLEを使用してtbl_nameAUTO_INCREMENT =NAUTO_INCREMENT値をリセットすることもできます。 この値を、現在カラム内にある最大値より小さく設定することはできません。 -
AVG_ROW_LENGTHテーブルの平均の行の長さの近似値。 これを設定する必要があるのは、可変サイズの行を持つ大きなテーブルの場合だけです。
MyISAMテーブルを作成すると、MySQL はMAX_ROWSおよびAVG_ROW_LENGTHオプションの積を使用して、結果として得られるテーブルがどれくらいの大きさになるかを判定します。 どちらのオプションも指定しない場合、MyISAMデータおよびインデックスファイルの最大サイズは、デフォルトで 256T バイトになります。 (オペレーティングシステムでその大きさのファイルがサポートされていない場合、テーブルサイズはファイルサイズ制限によって制約されます。) インデックスをより小さく、かつ高速にするためにポインタサイズを小さく維持したいと考えており、実際に大きなファイルが必要でない場合は、myisam_data_pointer_sizeシステム変数を設定することによってデフォルトのポインタサイズを小さくすることができます。 (セクション5.1.8「サーバーシステム変数」を参照してください。) すべてのテーブルをデフォルトの制限を超えて拡張できるようにしたいと考えており、テーブルが必要以上に少し遅く、かつ大きくなってもかまわない場合は、この変数を設定することによってデフォルトのポインタサイズを大きくすることができます。 この値を 7 に設定すると、最大 65,536T バイトのテーブルサイズが許可されます。 -
[DEFAULT] CHARACTER SETテーブルのデフォルトの文字セットを指定します。
CHARSETはCHARACTER SETのシノニムです。 文字セット名がDEFAULTである場合は、データベース文字セットが使用されます。 -
CHECKSUMMySQL ですべての行のライブチェックサム (つまり、テーブルが変更されると MySQL が自動的に更新するチェックサム) が保持されるようにする場合は、これを 1 に設定します。 これにより、テーブルの更新が少し遅くなりますが、破損したテーブルを見つけることが容易になります。
CHECKSUM TABLEステートメントは、このチェックサムをレポートします。 (MyISAMのみ。) -
[DEFAULT] COLLATEテーブルのデフォルトの照合を指定します。
-
COMMENTテーブルのコメントであり、長さは最大 2048 文字です。
table_optionCOMMENT句を使用して、テーブルのInnoDBMERGE_THRESHOLD値を設定できます。 セクション15.8.11「インデックスページのマージしきい値の構成」を参照してください。「NDB_TABLE の設定」オプション.
NDBテーブルを作成するCREATE TABLEのまたは変更するALTER TABLEステートメントのテーブルコメントは、NDB_TABLEオプションNOLOGGING,READ_BACKUP,PARTITION_BALANCE、またはFULLY_REPLICATEDの 1 つから 4 つを指定するのに使用でき、カンマ区切り (必要ならば) の名前 - 値ペアのセットとして、引用符付きテキストで始まる文字列NDB_TABLE=の直後に続きます。 この構文を使用したステートメントの例を次に示します (強調されたテキスト):CREATE TABLE t1 ( c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, c2 VARCHAR(100), c3 VARCHAR(100) ) ENGINE=NDB COMMENT="NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE";引用符で囲まれた文字列内ではスペースを使用できません。 文字列では大文字と小文字は区別されません。
コメントは、
SHOW CREATE TABLEの出力の一部として表示されます。 コメントのテキストは、MySQL Information SchemaTABLESテーブルの TABLE_COMMENT カラムとしても使用できます。このコメント構文は、
NDBテーブルのALTER TABLEステートメントでもサポートされています。ALTER TABLEで使用されるテーブルコメントは、テーブルにある可能性のある既存のコメントを置き換えることに注意してください。テーブルコメントでの
MERGE_THRESHOLDオプションの設定は、NDBテーブルではサポートされていません (無視されます)。完全な構文情報および例は、セクション13.1.20.11「NDB_TABLE オプションの設定」 を参照してください。
-
COMPRESSIONInnoDBテーブルのページレベル圧縮に使用される圧縮アルゴリズム。 サポートされている値は、Zlib、LZ4およびNoneです。COMPRESSION属性は、透過的ページ圧縮機能とともに導入されました。 ページ圧縮は、file-per-table テーブルスペースに存在するInnoDBテーブルでのみサポートされており、スパースファイルおよびホールパンチをサポートする Linux および Windows プラットフォームでのみ使用できます。 詳細は、セクション15.9.2「InnoDB ページ圧縮」を参照してください。 -
CONNECTIONFEDERATEDテーブルの接続文字列。注記古いバージョンの MySQL は、接続文字列に
COMMENTオプションを使用していました。 -
DATA DIRECTORY、INDEX DIRECTORYInnoDBの場合、DATA DIRECTORY='句を使用すると、データディレクトリ外にテーブルを作成できます。directory'DATA DIRECTORY句を使用するには、innodb_file_per_table変数を有効にする必要があります。 完全なディレクトリパスを指定する必要があります。 MySQL 8.0.21 では、指定されたディレクトリはInnoDBで認識されている必要があります。 詳細は、セクション15.6.1.2「外部でのテーブルの作成」を参照してください。MyISAMテーブルを作成する場合は、DATA DIRECTORY='句、directory'INDEX DIRECTORY='句、またはその両方を使用できます。 これらは、それぞれdirectory'MyISAMテーブルのデータファイルとインデックスファイルを配置する場所を指定します。InnoDBテーブルとは異なり、DATA DIRECTORYまたはINDEX DIRECTORYオプションでMyISAMテーブルを作成する場合、MySQL はデータベース名に対応するサブディレクトリを作成しません。 各ファイルは、指定されたディレクトリ内に作成されます。DATA DIRECTORYまたはINDEX DIRECTORYテーブルオプションを使用するには、FILE権限が必要です。重要テーブルレベルの
DATA DIRECTORYおよびINDEX DIRECTORYオプションは、パーティション化されたテーブルでは無視されます。 (Bug #32091)これらのオプションは、
--skip-symbolic-linksオプションを使用していない場合にのみ機能します。 また、オペレーティングシステムにも、機能するスレッドに対して安全なrealpath()呼び出しが存在する必要があります。 詳細は、セクション8.12.2.2「Unix 上の MyISAM へのシンボリックリンクの使用」を参照してください。MyISAMテーブルがDATA DIRECTORYオプションなしで作成される場合、.MYDファイルがデータベースディレクトリ内に作成されます。 デフォルトでは、MyISAMが既存の.MYDファイルを検出した場合、そのファイルを上書きします。INDEX DIRECTORYオプションを指定せずに作成されたテーブルについて、.MYIファイルに同じことが当てはまります。 この動作を抑制するには、--keep_files_on_createオプションを使用してサーバーを起動します。この場合、MyISAMは既存のファイルを上書きせず、かわりにエラーを返します。DATA DIRECTORYまたはINDEX DIRECTORYオプションを使用してMyISAMテーブルが作成され、既存の.MYDまたは.MYIファイルが見つかった場合、MyISAMは常にエラーを返し、指定されたディレクトリ内のファイルを上書きしません。重要DATA DIRECTORYまたはINDEX DIRECTORYでは、MySQL データディレクトリを含むパス名を使用できません。 これには、パーティション化されたテーブルや個々のテーブルパーティションが含まれます。 (Bug #32167 を参照してください。) -
DELAY_KEY_WRITEテーブルのキー更新をテーブルが閉じられるまで遅らせる場合は、これを 1 に設定します。 セクション5.1.8「サーバーシステム変数」にある
delay_key_writeシステム変数の説明を参照してください。 (MyISAMのみ。) -
ENCRYPTIONENCRYPTION句は、InnoDBテーブルのページレベルのデータ暗号化を有効または無効にします。 暗号化を有効にする前に、キーリングプラグインをインストールして構成する必要があります。 MySQL 8.0.16 より前では、ENCRYPTION句は file-per-table テーブルスペースにテーブルを作成する場合にのみ指定できます。 MySQL 8.0.16 では、一般的なテーブルスペースにテーブルを作成するときにENCRYPTION句を指定することもできます。MySQL 8.0.16 では、
ENCRYPTION句が指定されていない場合、テーブルはデフォルトのスキーマ暗号化を継承します。table_encryption_privilege_check変数が有効になっている場合、デフォルトのスキーマ暗号化とは異なるENCRYPTION句設定を使用してテーブルを作成するには、TABLE_ENCRYPTION_ADMIN権限が必要です。 一般的なテーブルスペースにテーブルを作成する場合、テーブルとテーブルスペースの暗号化は一致する必要があります。MySQL 8.0.16 の時点では、暗号化をサポートしていないストレージエンジンを使用する場合、
'N'または''以外の値でENCRYPTION句を指定することはできません。 以前は、条項は受け入れられました。詳細は、セクション15.13「InnoDB 保存データ暗号化」を参照してください。
-
ENGINE_ATTRIBUTEおよびSECONDARY_ENGINE_ATTRIBUTEオプション (MySQL 8.0.21 の時点で使用可能) を使用して、プライマリおよびセカンダリストレージエンジンのテーブル属性を指定します。 オプションは、将来の使用のために予約されています。許可される値は、有効な
JSONドキュメントまたは空の文字列 ('') を含む文字列リテラルです。 無効なJSONが拒否されました。CREATE TABLE t1 (c1 INT) ENGINE_ATTRIBUTE='{"key":"value"}';ENGINE_ATTRIBUTEおよびSECONDARY_ENGINE_ATTRIBUTEの値は、エラーなしで繰り返すことができます。 この場合、最後に指定した値が使用されます。ENGINE_ATTRIBUTEおよびSECONDARY_ENGINE_ATTRIBUTEの値は、サーバーによってチェックされず、テーブルストレージエンジンが変更されたときにもクリアされません。 -
INSERT_METHODMERGEテーブルにデータを挿入する場合は、INSERT_METHODを使用して、行を挿入するテーブルを指定する必要があります。INSERT_METHODは、MERGEテーブルにのみ役立つオプションです。 最初または最後のテーブルに挿入するにはFIRSTまたはLASTの値を、挿入されないようにするにはNOの値を使用します。 セクション16.7「MERGE ストレージエンジン」を参照してください。 -
KEY_BLOCK_SIZEMyISAMテーブルの場合、KEY_BLOCK_SIZEはオプションで、インデックスキーブロックに使用するサイズをバイト単位で指定します。 この値はヒントとして扱われます。必要に応じて、異なるサイズが使用される可能性があります。 個々のインデックス定義に指定されたKEY_BLOCK_SIZE値は、テーブルレベルのKEY_BLOCK_SIZE値をオーバーライドします。InnoDBテーブルの場合、KEY_BLOCK_SIZEは compressedInnoDBテーブルに使用する page サイズを KB 単位で指定します。KEY_BLOCK_SIZE値は、ヒントとして処理されます。InnoDBでは、必要に応じて異なるサイズが使用される可能性があります。KEY_BLOCK_SIZEは、innodb_page_size値以下にのみできます。 値 0 は、innodb_page_size値の半分であるデフォルトの圧縮済みページサイズを表します。innodb_page_sizeに応じて、可能なKEY_BLOCK_SIZE値には 0、1、2、4、8 および 16 が含まれます。 詳しくはセクション15.9.1「InnoDB テーブルの圧縮」をご覧ください。InnoDBテーブルにKEY_BLOCK_SIZEを指定する場合、Oracle ではinnodb_strict_modeを有効にすることをお薦めします。innodb_strict_modeが有効な場合、無効なKEY_BLOCK_SIZE値を指定するとエラーが返されます。innodb_strict_modeが無効な場合、無効なKEY_BLOCK_SIZE値は警告になり、KEY_BLOCK_SIZEオプションは無視されます。SHOW TABLE STATUSに対するレスポンスのCreate_optionsカラムには、SHOW CREATE TABLEと同様に、テーブルで使用される実際のKEY_BLOCK_SIZEがレポートされます。InnoDBでは、テーブルレベルでのKEY_BLOCK_SIZEのみがサポートされます。KEY_BLOCK_SIZEは、32KB および 64KB のinnodb_page_size値ではサポートされていません。InnoDBテーブル圧縮では、これらのページサイズはサポートされていません。InnoDBでは、一時テーブルの作成時にKEY_BLOCK_SIZEオプションをサポートしていません。 -
MAX_ROWSテーブル内に格納することを予定している行の最大数。 これは強い制限値ではなく、どちらかと言うと、テーブルが少なくともこの行数を格納できる必要があるという、ストレージエンジンへのヒントです。
重要NDBテーブルでMAX_ROWSを使用してテーブルパーティションの数を制御することは非推奨です。 下位互換性のために新しいバージョンでも引き続きサポートされますが、将来のリリースでは削除される予定です。 かわりに PARTITION_BALANCE を使用してください。「NDB_TABLE の設定」オプション を参照してください。NDBストレージエンジンは、この値を最大値として扱います。 非常に大きな「NDB Cluster」テーブル (数百万行を含む) を作成する場合は、このオプションを使用して、MAX_ROWS = 2 *を設定することで、rowsNDBがテーブルの主キーのハッシュの格納に使用するハッシュテーブルに十分な数の索引スロットを割り当てるようにする必要があります (rowsは、テーブルに挿入する予定の行数です)。MAX_ROWSの最大値は 4294967295 です。これを超える値は、この制限に切り捨てられます。 -
MIN_ROWSテーブル内に格納することを予定している行の最小数。
MEMORYストレージエンジンは、このオプションをメモリー使用に関するヒントとして使用します。 -
PACK_KEYSMyISAMテーブルでのみ有効です。 インデックスを小さくする場合は、このオプションを 1 に設定します。 通常は、これによって更新は遅く、読み取りは高速になります。 このオプションを 0 に設定すると、キーのすべてのパッキングが無効になります。 これをDEFAULTに設定すると、長いCHAR、VARCHAR、BINARY、またはVARBINARYカラムのみをパックするようストレージエンジンに指示します。PACK_KEYSを使用しない場合、デフォルトでは文字列をパックしますが、数値はパックしません。PACK_KEYS=1を使用した場合は、数値もパックされます。2 進数のキーをパックする場合、MySQL は次のプリフィクス圧縮を使用します。
前のキーの何バイトが次のキーと同じであるかを示すために、すべてのキーに 1 バイトが余分に必要になります。
行へのポインタは、圧縮率を向上させるために、キーの直後に高位バイトが先に来る順序で格納されます。
つまり、2 つの連続した行に等しいキーが多数存在する場合は、次の「同じ」キーはすべて、通常 (行へのポインタを含め) 2 バイトしか占有しません。 これを、次のキーが
storage_size_for_key + pointer_size(ここで、ポインタサイズは通常 4) を占有する通常のケースと比較してください。 逆に言うと、プリフィクス圧縮から大きな利点が得られるのは、同じ数値が多数存在する場合だけです。 すべてのキーが完全に異なっている場合は、そのキーがNULL値を持つことができるキーでないかぎり、キーあたり 1 バイト多く使用されます。 (この場合、パックされたキーの長さは、キーがNULLであるかどうかをマークするために使用されるのと同じバイトに格納されます。) -
PASSWORDこのオプションは使用されません。
-
ROW_FORMAT行が格納される物理フォーマットを定義します。
strict mode を無効にしてテーブルを作成する場合、指定した行フォーマットがサポートされていないと、ストレージエンジンのデフォルトの行フォーマットが使用されます。 テーブルの実際の行形式は、
SHOW TABLE STATUSに応じてRow_formatカラムにレポートされます。Create_optionsカラムには、SHOW CREATE TABLEと同様に、CREATE TABLEステートメントで指定された行形式が表示されます。行形式の選択は、テーブルに使用されるストレージエンジンによって異なります。
InnoDBテーブルの場合:-
デフォルトの行フォーマットは、
DYNAMICのデフォルト設定を持つinnodb_default_row_formatによって定義されます。 デフォルトの行フォーマットは、ROW_FORMATオプションが定義されていない場合、またはROW_FORMAT=DEFAULTが使用されている場合に使用されます。ROW_FORMATオプションが定義されていない場合、またはROW_FORMAT=DEFAULTが使用されている場合は、テーブルを再構築する操作によって、テーブルの行形式もinnodb_default_row_formatで定義されているデフォルトに暗黙的に変更されます。 詳細は、テーブルの行形式の定義を参照してください。 データ型 (特に
BLOB型) のInnoDB記憶域をより効率的にするには、DYNAMICを使用します。DYNAMICの行形式に関連する要件については、DYNAMIC 行フォーマット を参照してください。InnoDBテーブルの圧縮を有効にするには、ROW_FORMAT=COMPRESSEDを指定します。 一時テーブルを作成する場合、ROW_FORMAT=COMPRESSEDオプションはサポートされません。COMPRESSEDの行形式に関連する要件については、セクション15.9「InnoDB のテーブルおよびページの圧縮」 を参照してください。以前のバージョンの MySQL で使用されていた行形式は、
REDUNDANTの行形式を指定することで引き続きリクエストできます。デフォルト以外の
ROW_FORMAT句を指定する場合は、innodb_strict_mode構成オプションも有効にすることを考慮してください。ROW_FORMAT=FIXEDはサポートされていません。innodb_strict_modeが無効になっているときにROW_FORMAT=FIXEDが指定された場合、InnoDBは警告を発行し、ROW_FORMAT=DYNAMICとみなします。innodb_strict_modeが有効になっている間にROW_FORMAT=FIXEDが指定されている場合 (デフォルト)、InnoDBはエラーを返します。InnoDB行フォーマットの詳細は、セクション15.10「InnoDB の行フォーマット」を参照してください。
MyISAMテーブルの場合は、このオプション値を、静的行フォーマットまたは可変長行フォーマットを示すFIXEDまたはDYNAMICに設定できます。myisampack は、この型をCOMPRESSEDに設定します。 セクション16.2.3「MyISAM テーブルのストレージフォーマット」を参照してください。NDBテーブルの場合、デフォルトのROW_FORMATはDYNAMICです。 -
-
STATS_AUTO_RECALCInnoDBテーブルの永続的統計を自動的に再計算するかどうかを指定します。 値DEFAULTを指定すると、テーブルの永続的統計設定はinnodb_stats_auto_recalc構成オプションによって決定されます。 値1を指定すると、統計は、テーブル内のデータの 10% が変更されたときに再計算されます。 値0は、このテーブルの自動再計算が行われないようにします。この設定の場合、テーブルへの大幅な変更を行なったあとに統計を再計算するには、ANALYZE TABLEステートメントを発行します。 永続的統計機能の詳細は、セクション15.8.10.1「永続的オプティマイザ統計のパラメータの構成」を参照してください。 -
STATS_PERSISTENTInnoDBテーブルの永続的統計を有効にするかどうかを指定します。 値DEFAULTを指定すると、テーブルの永続的統計設定はinnodb_stats_persistent構成オプションによって決定されます。 値1がテーブルの永続的統計を有効にするのに対して、値0はこの機能を無効にします。CREATE TABLEまたはALTER TABLEステートメントを使用して永続的統計を有効にしたあと、代表的なデータのテーブルへのロード後に統計を計算するには、ANALYZE TABLEステートメントを発行します。 永続的統計機能の詳細は、セクション15.8.10.1「永続的オプティマイザ統計のパラメータの構成」を参照してください。 -
STATS_SAMPLE_PAGESインデックス付きカラムのカーディナリティーやその他の統計 (
ANALYZE TABLEによって計算される統計など) を推定するときにサンプリングするインデックスページの数。 詳細は、セクション15.8.10.1「永続的オプティマイザ統計のパラメータの構成」を参照してください。 -
TABLESPACETABLESPACE句を使用すると、既存の一般テーブルスペース、file-per-table テーブルスペースまたはシステムテーブルスペースにテーブルを作成できます。CREATE TABLE tbl_name ... TABLESPACE [=] tablespace_nameTABLESPACE句を使用する前に、指定する一般テーブルスペースが存在している必要があります。 一般テーブルスペースの詳細は、セクション15.6.3.3「一般テーブルスペース」 を参照してください。は、大/小文字を区別する識別子です。 引用符で囲むことも、引用符で囲まないこともできます。 スラッシュ文字 (「/」) は使用できません。 「innodb_」で始まる名前は、特別な用途のために予約されています。tablespace_nameシステムテーブルスペースにテーブルを作成するには、テーブルスペース名として
innodb_systemを指定します。CREATE TABLE tbl_name ... TABLESPACE [=] innodb_systemTABLESPACE [=] innodb_systemを使用すると、innodb_file_per_tableの設定に関係なく、圧縮されていない行形式のテーブルをシステムテーブルスペースに配置できます。 たとえば、TABLESPACE [=] innodb_systemを使用して、ROW_FORMAT=DYNAMICを含むテーブルをシステムテーブルスペースに追加できます。file-per-table テーブルスペースにテーブルを作成するには、テーブルスペース名として
innodb_file_per_tableを指定します。CREATE TABLE tbl_name ... TABLESPACE [=] innodb_file_per_table注記innodb_file_per_tableが有効な場合、InnoDBfile-per-table テーブルスペースを作成するためにTABLESPACE=innodb_file_per_tableを指定する必要はありません。InnoDBテーブルは、innodb_file_per_tableが有効な場合、デフォルトで file-per-table テーブルスペースに作成されます。DATA DIRECTORY句はCREATE TABLE ... TABLESPACE=innodb_file_per_tableでは許可されますが、それ以外の場合はTABLESPACE句との組合せでの使用はサポートされていません。 MySQL 8.0.21 では、DATA DIRECTORY句で指定されたディレクトリはInnoDBで認識されている必要があります。 詳細は、DATA DIRECTORY 句の使用を参照してください。注記CREATE TEMPORARY TABLEでのTABLESPACE = innodb_file_per_table句およびTABLESPACE = innodb_temporary句のサポートは、MySQL 8.0.13 で非推奨になりました。MySQL の将来のバージョンで削除される予定です。STORAGEテーブルオプションは、NDBテーブルでのみ使用されます。STORAGEは、使用される記憶域のタイプ (ディスクまたはメモリー) を決定し、DISKまたはMEMORYのいずれかになります。TABLESPACE ... STORAGE DISKは、「NDB Cluster ディスクデータ」テーブルスペースにテーブルを割り当てます。 テーブルスペースは、CREATE TABLESPACEを使用してすでに作成されている必要があります。 詳細は、セクション23.5.10「NDB Cluster ディスクデータテーブル」を参照してください。重要STORAGE句を、TABLESPACE句のないCREATE TABLEステートメントで使用することはできません。 -
UNION同一の
MyISAMテーブルのコレクションにアクセスするために使用します。 これは、MERGEテーブルでのみ機能します。 セクション16.7「MERGE ストレージエンジン」を参照してください。MERGEテーブルにマップするテーブルに対するSELECT、UPDATE、およびDELETE権限が必要です。注記以前は、使用されるすべてのテーブルが
MERGEテーブル自体と同じデータベース内に存在する必要がありました。 この制限は適用されなくなりました。
テーブルのパーティション化
partition_options を使用すると、CREATE TABLE で作成されたテーブルのパーティション化を制御できます。
このセクションの最初にある partition_options の構文に示されているすべてのオプションが、すべてのパーティショニングタイプに使用できるわけではありません。 各タイプに固有の情報については、次の個々のタイプのリストを参照してください。また、MySQL でのパーティション化の動作や使用に関するより詳細な情報、および MySQL のパーティション化に関連したテーブル作成やその他のステートメントの追加の例については、第24章「パーティション化」を参照してください。
パーティションに対しては変更、マージ、テーブルへの追加、およびテーブルからの削除が可能です。 これらのタスクを実行するための MySQL ステートメントに関する基本情報については、セクション13.1.9「ALTER TABLE ステートメント」を参照してください。 より詳細な説明および例については、セクション24.3「パーティション管理」を参照してください。
-
PARTITION BYpartition_options句が使用される場合、この句はPARTITION BYで始まります。 この句には、パーティションを決定するために使用される関数が含まれています。この関数は、1 からnumまでの範囲の整数値を返します。ここで、numはパーティションの数です。 (テーブルに含めることのできるユーザー定義パーティションの最大数は 1024 です。この最大数には、このセクションのあとの方で説明されているサブパーティションの数が含まれています。)注記PARTITION BY句で使用される式 (expr) は、作成されているテーブルにはないどのカラムも参照できません。このような参照は明確に禁止されており、そのステートメントがエラーで失敗する原因になります。 (Bug #29444) -
HASH(expr)1 つ以上のカラムをハッシュして、行を配置および検索するためのキーを作成します。
exprは、1 つ以上のテーブルのカラムを使用する式です。 これは、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), col3 DATETIME) PARTITION BY HASH ( YEAR(col3) );PARTITION BY HASHでは、VALUES LESS THANまたはVALUES INのどちらの句も使用できません。PARTITION BY HASHは、exprをパーティションの数で割った余り (つまり、法) を使用します。 例および追加情報については、セクション24.2.4「HASH パーティショニング」を参照してください。LINEARキーワードには、いくぶん異なるアルゴリズムが必要になります。 この場合、行が格納されるパーティションの数は、1 つ以上の論理的なAND演算の結果として計算されます。 線形ハッシュの説明および例については、セクション24.2.4.1「LINEAR HASH パーティショニング」を参照してください。 -
KEY(column_list)これは
HASHと似ていますが、偶数のデータ分散を保証するために、MySQL がハッシュ関数を提供する点が異なります。column_list引数は、単純に 1 つ以上のテーブルカラム (最大 16 個) のリストです。 この例は、4 つのパーティションを持つ、キーによってパーティション化された単純なテーブルを示しています。CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY KEY(col3) PARTITIONS 4;キーによってパーティション化されたテーブルの場合は、
LINEARキーワードを使用して線形パーティション化を採用できます。 これには、HASHによってパーティション化されたテーブルの場合と同じ効果があります。 つまり、パーティション番号は法ではなく、&演算子を使用して見つけられます (詳細は、セクション24.2.4.1「LINEAR HASH パーティショニング」およびセクション24.2.5「KEY パーティショニング」を参照してください)。 この例では、キーによる線形パーティション化を使用して 5 つのパーティション間でデータを分散させます。CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY LINEAR KEY(col3) PARTITIONS 5;ALGORITHM={1 | 2}オプションは、[SUB]PARTITION BY [LINEAR] KEYでサポートされます。ALGORITHM=1を指定すると、サーバーは MySQL 5.1 と同じキーハッシュ関数を使用します。ALGORITHM=2は、サーバーが、MySQL 5.5 以降で実装され、KEYによってパーティション化された新しいテーブルに対してデフォルトで使用されるキーハッシュ関数を採用することを示します。 (MySQL 5.5 以降で採用されたキーハッシュ関数によって作成されたパーティション化されたテーブルを MySQL 5.1 サーバーで使用することはできません。) このオプションを指定しない場合は、ALGORITHM=2を使用するのと同じ効果があります。 このオプションは、主に[LINEAR] KEYによってパーティション化されたテーブルを MySQL 5.1 以降の MySQL バージョン間でアップグレードまたはダウングレードするときに使用するか、または MySQL 5.5 以降のサーバー上で、MySQL 5.1 サーバー上で使用できるKEYまたはLINEAR KEYによってパーティション化されたテーブルを作成することを目的にしています。 詳細は、セクション13.1.9.1「ALTER TABLE パーティション操作」を参照してください。MySQL 5.7 以降の mysqldump では、次のようにバージョニングされたコメントにこのオプションが含まれています:
CREATE TABLE t1 (a INT) /*!50100 PARTITION BY KEY */ /*!50611 ALGORITHM = 1 */ /*!50100 () PARTITIONS 3 */これにより、MySQL 5.6.10 以前のサーバーはこのオプションを無視するようになります。これらのバージョンでは、通常であれば構文エラーが発生します。
KEYによってパーティション化またはサブパーティション化されたテーブルをバージョン 5.6.11 より前の MySQL 5.6 サーバーに使用する MySQL 5.7 サーバーで作成されたダンプをロードする場合は、先に進む前に Changes in MySQL 5.6 に問い合せてください。 (見つかった情報は、MySQL 5.7(事実上 5.6.11 または later-server) から作成されたKEYパーティションテーブルまたはサブパーティションテーブルを含むダンプを MySQL 5.5.30 以前のサーバーにロードする場合にも適用されます。)また、MySQL 5.6.11 以降では、
ALGORITHM=1が mysqldump と同じ方法で、バージョン管理されたコメントを使用してSHOW CREATE TABLEの出力に必要に応じて表示されます。ALGORITHM=2は、元のテーブルを作成するときにこのオプションが指定された場合でも、SHOW CREATE TABLEの出力から常に省略されます。PARTITION BY KEYでは、VALUES LESS THANまたはVALUES INのどちらの句も使用できません。 -
RANGE(expr)この場合、
exprでは、一連のVALUES LESS THAN演算子を使用して値の範囲が表示されます。 範囲のパーティション化を使用する場合は、VALUES LESS THANを使用して、少なくとも 1 つのパーティションを定義する必要があります。 範囲のパーティション化ではVALUES INを使用できません。注記RANGEによってパーティション化されたテーブルでは、VALUES LESS THANを整数リテラル値、または 1 つの整数値に評価される式のどちらかとともに使用する必要があります。 MySQL 8.0 では、このセクションのあとの方で説明されている、PARTITION BY RANGE COLUMNSを使用して定義されたテーブルでこの制限を克服できます。次のスキームに従って、年の値を含むカラムに関してパーティション化するテーブルがあるとします。
パーティション番号: 年の範囲: 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は、それ以外で指定されている最大値より大きい「残りの」値を指定するように機能します。VALUES LESS THAN句は、switch ... caseブロックのcase部分と同様の方法で順次機能します (C、Java、PHP などの多くのプログラミング言語で使用されています)。 つまり、この句は、連続した各VALUES LESS THANで指定されている上限が前の句の上限より大きく、かつMAXVALUEを参照している句がリスト内のすべての句の最後に来るような方法で配置されている必要があります。 -
RANGE COLUMNS(column_list)RANGEのこのバリアントにより、複数のカラムで範囲条件を使用する (つまり、WHERE a = 1 AND b < 10やWHERE a = 1 AND b = 10 AND c < 10などの条件を持つ) クエリーのパーティションプルーニングが容易になります。 これにより、COLUMNS句内のカラムのリストと、各PARTITION ... VALUES LESS THAN (パーティション定義句内のカラム値のセットを使用して、複数のカラム内の値の範囲を指定できるようになります。 (もっとも単純なケースでは、このセットは単一カラムで構成されます。)value_list)column_listおよびvalue_listで参照できるカラムの最大数は 16 です。COLUMNS句で使用されるcolumn_listには、カラムの名前のみを含めることができます。リスト内の各カラムは MySQL のデータ型のうち、整数型、文字列型、および時間または日付カラム型のいずれかである必要があります。BLOB、TEXT、SET、ENUM、BIT、または空間データ型を使用したカラムは許可されていません。浮動小数点数型を使用するカラムも許可されていません。 また、COLUMNS句では、関数や演算式も使用できません。パーティション定義で使用される
VALUES LESS THAN句は、COLUMNS()句に現れるカラムごとにリテラル値を指定する必要があります。つまり、各VALUES LESS THAN句で使用される値のリストには、COLUMNS句にリストされているカラムの数と同じ数の値が含まれている必要があります。VALUES LESS THAN句でCOLUMNS句に存在する数より多いか、または少ない値を使用しようとすると、このステートメントは次のエラーで失敗します。Inconsistency in usage of column lists for partitioning....VALUES LESS THANに現れるどの値にもNULLは使用できません。 この例に示すように、最初のカラム以外の特定のカラムでMAXVALUEを複数回使用できます。CREATE TABLE rc ( a INT NOT NULL, b INT NOT NULL ) PARTITION BY RANGE COLUMNS(a,b) ( PARTITION p0 VALUES LESS THAN (10,5), PARTITION p1 VALUES LESS THAN (20,10), PARTITION p2 VALUES LESS THAN (50,MAXVALUE), PARTITION p3 VALUES LESS THAN (65,MAXVALUE), PARTITION p4 VALUES LESS THAN (MAXVALUE,MAXVALUE) );VALUES LESS THAN値リストで使用されている各値が、対応するカラムの型に正確に一致している必要があります。変換は行われません。 たとえば、整数型を使用するカラムに一致する値として文字列'1'を使用したり (代わりに、数値1を使用する必要があります)、文字列型を使用するカラムに一致する値として数値1を使用したりすることはできません (このような場合は、引用符で囲まれた文字列'1'を使用する必要があります)。詳細は、セクション24.2.1「RANGE パーティショニング」およびセクション24.4「パーティションプルーニング」を参照してください。
-
LIST(expr)これは、州や国コードなど、使用可能な値の制限されたセットを持つテーブルのカラムに基づいてパーティションを割り当てる場合に役立ちます。 このような場合は、特定の州または国に関連するすべての行を単一パーティションに割り当てたり、特定の州または国のセットのためにパーティションを予約したりできます。 これは
RANGEに似ていますが、各パーティションに許可される値を指定するためにVALUES INしか使用できない点が異なります。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 つのパーティションを定義する必要があります。PARTITION BY LISTではVALUES LESS THANを使用できません。注記LISTによってパーティション化されたテーブルでは、VALUES INで使用される値リストを整数値のみで構成する必要があります。 MySQL 8.0 では、このセクションのあとの方で説明されている、LIST COLUMNSによるパーティション化を使用してこの制限を克服できます。 -
LIST COLUMNS(column_list)LISTのこのバリアントにより、複数のカラムで比較条件を使用する (つまり、WHERE a = 5 AND b = 5やWHERE a = 1 AND b = 10 AND c = 5などの条件を持つ) クエリーのパーティションプルーニングが容易になります。 これにより、COLUMNS句内のカラムのリストと、各PARTITION ... VALUES IN (パーティション定義句内のカラム値のセットを使用して、複数のカラム内の値を指定できるようになります。value_list)LIST COLUMNS(で使用されるカラムリストとcolumn_list)VALUES IN(で使用される値リストに関連したデータ型を管理するルールは、value_list)VALUES IN句ではMAXVALUEが許可されず、NULLを使用できる点を除き、それぞれRANGE COLUMNS(で使用されるカラムリストとcolumn_list)VALUES LESS THAN(で使用される値リストの場合のルールと同じです。value_list)PARTITION BY LIST COLUMNSでVALUES INに使用される値のリストには、PARTITION BY LISTで使用された場合と比較して重要な違いが 1 つあります。PARTITION BY LIST COLUMNSで使用された場合、VALUES IN句内の各要素は、カラム値のセットである必要があります。各セット内の値の数はCOLUMNS句で使用されているカラム数と同じである必要があり、これらの値のデータ型はそれらのカラムのデータ型に一致している (しかも、同じ順序で現れる) 必要があります。 もっとも単純なケースでは、このセットは単一カラムで構成されます。column_listおよびvalue_listを構成する各要素で使用できるカラムの最大数は 16 です。次の
CREATE TABLEステートメントで定義されるテーブルは、LIST COLUMNSパーティション化を使用したテーブルの例を示しています。CREATE TABLE lc ( a INT NULL, b INT NULL ) PARTITION BY LIST COLUMNS(a,b) ( PARTITION p0 VALUES IN( (0,0), (NULL,NULL) ), PARTITION p1 VALUES IN( (0,1), (0,2), (0,3), (1,1), (1,2) ), PARTITION p2 VALUES IN( (1,0), (2,0), (2,1), (3,0), (3,1) ), PARTITION p3 VALUES IN( (1,3), (2,2), (2,3), (3,2), (3,3) ) ); -
PARTITIONSnumオプションで、
PARTITIONS句を使用してパーティションの数を指定できます。ここで、numnumはパーティションの数です。 この句とほかのいずれかのPARTITION句の両方が使用されている場合、numは、PARTITION句を使用して宣言されているすべてのパーティションの総数と同じである必要があります。注記RANGEまたはLISTによってパーティション化されたテーブルの作成でPARTITIONS句を使用するかどうかにかかわらず、テーブル定義には引き続き、少なくとも 1 つのPARTITION VALUES句を含める必要があります (下を参照してください)。 -
SUBPARTITION BYオプションで、パーティションを複数のサブパーティションに分割できます。 これは、オプションの
SUBPARTITION BY句を使用して示すことができます。 サブパーティション化は、HASHまたはKEYによって実行できます。 これらのどちらもLINEARにすることができます。 これらは、同等のパーティショニングタイプについて前に説明したのと同じように機能します。 (LISTまたはRANGEによってサブパーティション化することはできません。)サブパーティションの数は、
SUBPARTITIONSキーワードと、そのあとの整数値を使用して示すことができます。 -
PARTITIONSまたはSUBPARTITIONS句で使用されている値の厳密なチェックが適用され、この値は次のルールに従っている必要があります。この値は 0 以外の正の整数である必要があります。
先頭の 0 は許可されません。
この値は整数リテラルである必要があり、式にすることはできません。 たとえば、
0.2E+01が2に評価されたとしても、PARTITIONS 0.2E+01は許可されません。 (Bug #15890)
-
partition_definition各パーティションは、
partition_definition句を使用して個別に定義できます。 この句を構成する個別の部分は次のとおりです。-
PARTITIONpartition_nameパーティションの論理名を指定します。
-
VALUESレンジパーティション化では、各パーティションに
VALUES LESS THAN句が含まれている必要があります。リストパーティション化では、パーティションごとにVALUES IN句を指定する必要があります。 これは、このパーティションにどの行を格納するかを決定するために使用されます。 構文の例については、第24章「パーティション化」にあるパーティショニングタイプの説明を参照してください。 -
[STORAGE] ENGINEMySQL は、
PARTITIONとSUBPARTITIONの両方に対して[STORAGE] ENGINEオプションを受け入れます。 現在、このオプションを使用できる唯一の方法は、すべてのパーティションまたはすべてのサブパーティションを同じストレージエンジンに設定し、同じテーブル内のパーティションまたはサブパーティションに異なるストレージエンジンを設定しようとすると、「ERROR 1469 (HY000): パーティション内のハンドラの混在は、このバージョンの MySQL では許可されていません」エラーが発生することです。 -
COMMENTオプションの
COMMENT句を使用すると、このパーティションを説明する文字列を指定できます。 例:COMMENT = 'Data for the years previous to 1999'パーティションコメントの最大長は 1024 文字です。
-
DATA DIRECTORYおよびINDEX DIRECTORYDATA DIRECTORYとINDEX DIRECTORYは、それぞれ、このパーティションのデータとインデックスが格納されるディレクトリを示すために使用できます。とdata_dirはどちらも、絶対システムパス名である必要があります。index_dirMySQL 8.0.21 では、
DATA DIRECTORY句で指定されたディレクトリはInnoDBで認識されている必要があります。 詳細は、DATA DIRECTORY 句の使用を参照してください。DATA DIRECTORYまたはINDEX DIRECTORYパーティションオプションを使用するには、FILE権限が必要です。例:
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 p2002 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 つのデータディレクトリと 1 つのインデックスディレクトリを指定できます。 指定されないままになっている場合、データとインデックスは、デフォルトではそのテーブルのデータベースディレクトリ内に格納されます。
DATA DIRECTORYおよびINDEX DIRECTORYオプションは、NO_DIR_IN_CREATEが有効になっている場合、パーティション化されたテーブルの作成では無視されます。 -
MAX_ROWSおよびMIN_ROWSパーティションに格納する行の最大数と最小数をそれぞれ指定するために使用できます。
max_number_of_rowsとmin_number_of_rowsの値は正の整数である必要があります。 同じ名前を持つテーブルレベルのオプションと同様に、これらはサーバーへの「提案」としてのみ機能し、強い制限値ではありません。 -
TABLESPACETABLESPACE `innodb_file_per_table`を指定して、パーティションのInnoDBfile-per-table テーブルスペースを指定するために使用できます。 すべてのパーティションは同じストレージエンジンに属している必要があります。InnoDBテーブルパーティションの共有InnoDBテーブルスペースへの配置はサポートされていません。 共有テーブルスペースには、InnoDBシステムテーブルスペースおよび一般テーブルスペースが含まれます。
-
-
subpartition_definitionオプションで、パーティション定義に 1 つ以上の
subpartition_definition句を含めることができます。 これらの各句は、少なくともSUBPARTITIONで構成されます。ここで、namenameはそのサブパーティションの識別子です。PARTITIONキーワードがSUBPARTITIONに置き換えられる点を除き、サブパーティション定義の構文はパーティション定義の構文と同じです。サブパーティション化は
HASHまたはKEYによって実行する必要があり、RANGEまたはLISTパーティションに対してのみ実行できます。 セクション24.2.6「サブパーティショニング」を参照してください。
生成されたカラムによるパーティション化
生成されたカラムによるパーティション化が許可されます。 例:
CREATE TABLE t1 (
s1 INT,
s2 INT AS (EXP(s1)) STORED
)
PARTITION BY LIST (s2) (
PARTITION p1 VALUES IN (1)
);
パーティション化では、生成されたカラムは通常のカラムとして認識されます。これにより、パーティション化が許可されていない関数の制限の回避策が有効になります (セクション24.6.3「関数に関連するパーティショニング制限」 を参照)。 前述の例は、この方法を示しています: EXP() は PARTITION BY 句で直接使用できませんが、EXP() を使用して定義された生成されたカラムは許可されます。