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_name
column_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_type
index_col_name
:col_name
[(length
)] [ASC | DESC]index_type
: USING {BTREE | HASH | RTREE}index_option
: KEY_BLOCK_SIZE [=]value
|index_type
| WITH PARSERparser_name
reference_definition
: REFERENCEStbl_name
(index_col_name
,...) [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE] [ON DELETEreference_option
] [ON UPDATEreference_option
]reference_option
: RESTRICT | CASCADE | SET NULL | NO ACTIONtable_options
:table_option
[[,]table_option
] ...table_option
: ENGINE [=]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_dir
max_number_of_rows
] [MIN_ROWS [=]min_number_of_rows
] [TABLESPACE [=]tablespace_name
] [NODEGROUP [=]node_group_id
] [(subpartition_definition
[,subpartition_definition
] ...)]subpartition_definition
: SUBPARTITIONlogical_name
[[STORAGE] ENGINE [=]engine_name
] [COMMENT [=]'comment_text'
] [DATA DIRECTORY [=] ''] [INDEX DIRECTORY [=] '
data_dir
'] [MAX_ROWS [=]
index_dir
max_number_of_rows
] [MIN_ROWS [=]min_number_of_rows
] [TABLESPACE [=]tablespace_name
] [NODEGROUP [=]node_group_id
]select_statement:
[IGNORE | REPLACE] [AS] SELECT ... (Some legal select statement
)
CREATE TABLE
は、与えられた名前でデータベースを作成します。テーブルに対して
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_name
WHEREauto_col
IS 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_name
SHOW 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 ARCHIVE Storage Engine
を参照してください。 |
CSV |
カンマで区切られた値のフォーマットで行を格納するテーブルThe CSV Storage Engine
を参照してください。 |
EXAMPLE |
例エンジンThe EXAMPLE Storage Engine
を参照してください。 |
FEDERATED |
リモートテーブルにアクセスするストレージエンジンThe FEDERATED Storage 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 MyISAM Storage 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
節を利用して任意に指定されます。この節、そして
num
PARTITION
節が両方利用されたら、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_dir
はどちらも、絶対システムパス名である必要があります。例
:
index_dir
CREATE TABLE th (id INT, name VARCHAR(30), adate DATE) PARTITION BY LIST(YEAR(adate)) ( PARTITION p1999 VALUES IN (1995, 1999, 2003) DATA DIRECTORY = '/var/appdata/95/data
' INDEX DIRECTORY = '/var/appdata/95/idx
', PARTITION p2000 VALUES IN (1996, 2000, 2004) DATA DIRECTORY = '/var/appdata/96/data
' INDEX DIRECTORY = '/var/appdata/96/idx
', PARTITION p2001 VALUES IN (1997, 2001, 2005) DATA DIRECTORY = '/var/appdata/97/data
' INDEX DIRECTORY = '/var/appdata/97/idx
', PARTITION p2000 VALUES IN (1998, 2002, 2006) DATA DIRECTORY = '/var/appdata/98/data
' INDEX DIRECTORY = '/var/appdata/98/idx
' );
DATA DIRECTORY
と
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
の最小値で構成されます。name
SUBPARTITION
を利用した 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_tbl
SELECT * 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_tbl
LIKEorig_tbl
;
コピーは元テーブルと同じバージョンのテーブルストレージフォーマットを利用して作成されます。元のテーブルには
SELECT
権限が必要です。
LIKE
は、ビューに対してではなく、ベーステーブルに対してのみ機能します。
CREATE TABLE ... LIKE
は、元テーブルに対して、または外部キー定義に対して指示された
DATA DIRECTORY
や
INDEX DIRECTORY
テーブルオプションを保管しません。
ユニークキー値を複製する行をどのように扱うかを指示するために、IGNORE
か REPLACE
によって
SELECT
を先行させることができます。IGNORE
利用すると、ユニークキー値上に既存の行を複製する新しい行は廃棄されます。REPLACE
を利用すると、新しい行は同じユニークキー値を持つ行を置き換えます。もし
IGNORE
も
REPLACE
も指示されなければ、複製ユニークキー値はエラーになります。
バイナリログが元テーブルを再作成するために利用できることを保障するために、MySQL
は
CREATE
TABLE ... SELECT
の最中の並列挿入を許可しません。