CREATE [TEMPORARY] TABLE [IF NOT EXISTS]tbl_name
(create_definition
,...) [table_option
...] [partition_options
]
または:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS]tbl_name
[(create_definition
,...)] [table_option
...] [partition_options
]select_statement
または:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS]tbl_name
{ LIKEold_tbl_name
| (LIKEold_tbl_name
) }create_definition
: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
:col_name
data_type
[NOT NULL | NULL] [DEFAULTdefault_value
] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string
'] [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}index_option
: KEY_BLOCK_SIZEvalue
|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_option
: [TABLESPACEtablespace_name
STORAGE DISK] ENGINE [=]engine_name
| AUTO_INCREMENT [=]value
| AVG_ROW_LENGTH [=]value
| [DEFAULT] CHARACTER SETcharset_name
| CHECKSUM [=] {0 | 1} | COLLATEcollation_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} | 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
権限を持つ必要があります。
項8.2. 「識別子」 に許容テーブル名のルールが紹介されています。デフォルトによって、デフォルト データベースの中にテーブルが作成されます。テーブルが既に存在したり、デフォルト データベースが無かったり、データベースが存在しなかったりするとエラーが発生します。
指定データベース内にテーブルを作成するには、テーブル名を
db_name.tbl_name
と指定する事ができます。この作業は、デフォルト
データベースが無くても、あると仮定して行われます。もし引用識別子を利用するなら、データベースとテーブル名は別々に引用してください。例えば、`mydb.mytbl`
ではなく `mydb`.`mytbl`
と書いてください。
テーブルを作成する時、TEMPORARY
キーワードを利用する事ができます。TEMPORARY
テーブルは現在の接続でのみ現れ、接続が終了すると自動的にドロップされます。これは、2つの異なる接続同士、または、既存の同名の非TEMPORARY
テーブルとお互いに対立する事無く、同じテンポラリ
テーブル名を利用する事ができるという意味になります。(テンポラリ
テーブルがドロップされるまで、既存テーブルは隠されています。)テンポラリ
テーブルを作成する為には CREATE TEMPORARY
TABLES
特権を持つ必要があります。
注意:CREATE
TABLE
は、もし TEMPORARY
キーワードを利用すると自動的に現在のアクティブなトランザクションを行いません。
もしテーブルが存在すると IF NOT
EXISTS
キーワードはエラーが起こるのを防ぎます。しかし、CREATE
TABLE
ステートメントに指示されたテーブルと既存テーブルが同一の構造である事の照合は行われません。注意:もし
IF NOT EXISTS
を CREATE TABLE ...
SELECT
ステートメント内で利用すると、SELECT
部分によって選択された全ての行はテーブルが既に存在するかどうかに関わらず挿入されます。
MySQL はそれぞれのテーブルをデータベース
ディレクトリ内に .frm
テーブル
フォーマットで表します。テーブルのストレージ
エンジンは別のファイルを作成する事もあります。MyISAM
テーブルの場合、ストレージ
エンジンはデータとインデックス
ファイルを作成します。従って、各
MyISAM
テーブル
tbl_name
は3つのディスク
ファイルを持ちます。
ファイル | 目的 |
|
テーブル フォーマット (定義) ファイル |
|
データ ファイル |
|
インデックス ファイル |
章 13. ストレージエンジンとテーブルタイプ でテーブルを表す為にそれぞれのストレージ エンジンがどのファイルを作成するのか説明されています。もしテーブル名が特別な文字を含んでいる場合、そのテーブル ファイルの名前は項8.2.3. 「ファイル名への識別子のマッピング」に表されているようにそれらの文字が暗号化された形を含んだ物になります。
data_type
は、データ
タイプはカラム定義だという事を意味します。
spatial_type
は空間データ
タイプを意味します。表示されるデータ
タイプ構文はただの見本です。各タイプの性質についての情報だけでなく、カラム
データ
タイプを指定する事ができる構文の完全な説明については、章 10. データタイプ
と 章 16. Spatial Extensions
を参照してください。
いくつかの属性は全てのデータ
タイプには対応しません。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
関数を利用してください。項11.10.3. 「情報関数」、項23.2.3.37. 「mysql_insert_id()
」
を参照して下さい。
もし NO_AUTO_VALUE_ON_ZERO
SQL
モードが有効であれば、新しいシーケンス値を発生させずに
0
を AUTO_INCREMENT
カラムに 0
として格納する事ができます。詳しくは
項4.2.6. 「SQL モード」
を参照してください。
注意:各テーブルに
AUTO_INCREMENT
カラムは1つだけ存在する事ができ、それはインデックスされる必要があり、DEFAULT
値を持つ事はできません。AUTO_INCREMENT
カラムは正数のみを含んでいる時だけ正しく機能します。負数を挿入すると、とても大きな正数を挿入したと解釈されます。これは、数字が正数から負数に
「ラップ」
される時の精度の問題を避ける為に、また
0
を含む
AUTO_INCREMENT
カラムを誤って採用してしまわない為に行われます。
MyISAM
テーブルには、複合カラム キー内の
AUTO_INCREMENT
セカンダリ
カラムを指定する事ができます。詳しくは
Using AUTO_INCREMENT
を参照してください。
MySQL 互換性がいくつかの ODBC
アプリケーション持つ為に、次のクエリを利用して、最後に挿入された行に
AUTO_INCREMENT
値を見つける事ができます。
SELECT * FROMtbl_name
WHEREauto_col
IS NULL
InnoDB
と
AUTO_INCREMENT
の更なる情報に関しては、項13.5.6.3. 「AUTO_INCREMENT
カラムが InnoDB
内でどのように機能するか」
を参照してください。
SERIAL
属性は BIGINT UNSIGNED
NOT NULL AUTO_INCREMENT UNIQUE
のエイリアスです。
文字データタイプ(CHAR
、VARCHAR
、TEXT
)は、文字セットとカラムの照合を指定する為にCHARACTER
SET
と COLLATE
属性を含む事ができます。詳細に関しては
章 9. キャラクタセットサポート
を参照して下さい。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
を指定する事ができます。詳しくは
項10.3.1.1. 「TIMESTAMP
MySQL 4.1での性質」
を参照してください。
もしカラム定義が明示的な
DEFAULT
値を含まない場合、MySQL
はデフォルト値を
項10.1.4. 「データタイプデフォルト値」
のように規定します。
BLOB
と TEXT
カラムはデフォルト値として割り当てる事ができません。
カラムのコメントは、255文字の長さまでで
COMMENT
オプションで指定できます。コメントは
SHOW CREATE TABLE
と SHOW FULL
COLUMNS
ステートメントによって表示されます。
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
を持つとスペースを無駄に利用します。(詳しくは
項13.5.13. 「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
を利用してテーブルのインデックス名を調べる事ができます。詳しくは
項12.5.4.17. 「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 5.3 以降は、カラム
リストの前でのオプションの使用は見られません。
index_option
値はインデックスの追加オプションを指定します。USING
はそのようなオプションの1つです。許容
index_option
値の詳細に関しては 項12.1.7. 「CREATE INDEX
構文」
を参照してください。
インデックスに関する更なる情報については、項6.4.5. 「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
バイトで成り立っているという事です。このようにカラム値のプリフィックスだけをインデックスする事で、インデックス
ファイルをとても小さくする事ができます。詳しくは
項6.4.3. 「カラムインデックス」 を参照してください。
MyISAM
と InnoDB
ストレージ エンジンだけが
BLOB
と TEXT
カラムのインデックスをサポートします。例:
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
プリフィックスは最高で1000バイトの長さまで可能です。(InnoDB
テーブルは767バイト)非バイナリ データ
タイプ
(CHAR
、VARCHAR
、TEXT
)では
CREATE TABLE
ステートメントのプリフィックス長は文字数で解釈される一方、プリフィックス
リミットはバイトで計算されるという事を覚えておいて下さい。マルチバイトの文字セットを利用するカラムのプリフィックス長を指定する時にはこれを考慮に入れておいて下さい。
index_col_name
仕様は
ASC
か DESC
で終わる事ができます。これらのキーワードは昇順や降順インデックス値ストレージを指定する為の将来の拡張子として許容されます。現在は、それらは解析されますが無視されます。インデックス値は毎回昇順で格納されます。
SELECT
内のTEXT
か
BLOB
カラムに対して ORDER
BY
か GROUP BY
を利用する時、サーバは
max_sort_length
システム変数によって指示された初期バイト数だけを利用して値をソートします。詳しくは
項10.4.3. 「BLOB
とTEXT
タイプ」 を参照してください。
フル テキスト検索に利用される特別な
FULLTEXT
インデックスを作成する事ができます。MyISAM
ストレージ エンジンだけが
FULLTEXT
インデックスをサポートします。それらは
CHAR
、
VARCHAR
、そして
TEXT
カラムからのみ作成する事ができます。インデックスする作業は必ずカラム全体に対して行われますので、部分的インデックスはサポートされておらず、プリフィックス長を指定しても無視されます。操作に関しての詳細は
項11.7. 「全文検索関数」
を参照してください。WITH PARSER
条項は、もしフル テキスト
インデックスと検索操作が特別対応を必要とするなら、インデックスと共にパーサー
プラグインと提携する為に
index_option
値として指定する事ができます。この条項は
FULLTEXT
インデックスだけに対して正当です。プラグインの作成に関しての詳細は項25.2. 「The MySQL Plugin Interface」
を参照してください。
空間データ タイプ上に SPATIAL
インデックスを作成する事ができます。空間タイプは
MyISAM
テーブルに対してだけサポートされており、インデックスされたカラムは
NOT NULL
として宣言されなければいけません。詳しくは
章 16. Spatial Extensions
を参照してください。
InnoDB
テーブルは外部キー制約のチェックをサポートします。詳しくは
項13.5. 「InnoDB
ストレージ エンジン」
を参照してください。InnoDB
内の FOREIGN KEY
構文は、このセクションの最初でCREATE
TABLE
ステートメントの為に紹介された構文よりも制限的である事を覚えておいてください。参照テーブルのカラムは必ず明確に名前を付けられる必要があります。InnoDB
は、外部キーへの ON DELETE
と
ON UPDATE
作用の両方をサポートします。正確な構文に関しては、項13.5.6.4. 「FOREIGN KEY
制約」
を参照してください。
その他のストレージ
エンジンに関しては、MySQL サーバは
CREATE TABLE
ステートメント内の
FOREIGN KEY
と
REFERENCES
構文を検索し無視します。CHECK
条項は、全てのストレージ
エンジンに解析されますが、無視されます。詳しくは
項1.8.5.5. 「外部キー」
を参照してください。
MyISAM
テーブルに対しては、各
NULL
カラムは1ビット余分に利用し、一番近いバイト数に丸められます。バイトでの最大行長は次のように計算されます。
row length = 1 + (sum of column lengths
) + (number of NULL columns
+delete_flag
+ 7)/8 + (number of variable-length columns
)
delete_flag
は静的行フォーマットのテーブルに対しては1です。静的テーブルは、行が削除されたかどうか指示するフラッグに対して行レコード内でビットを利用します。
delete_flag
は、フラッグがダイナミック行ヘッダー内で格納される為、ダイナミック
テーブルに対しては0です。
これらの計算は、NULL
カラムと
NOT NULL
カラムの格納サイズが同じである
InnoDB
テーブルには適応しません。
TABLESPACE ... STORAGE DISK
テーブルオプションは NDB Cluster
テーブルとのみ使用されます。これはテーブルをクラスタ
ディスク データ
テーブルスペースに割り当てます。tablespace_name
と名づけられたテーブルスペースは CREATE
TABLESPACE
を利用してあらかじめ作成されている必要があります。このテーブルオプションは
MySQL 5.1.6
で紹介されています。詳しくは項14.11. 「MySQL Cluster ディスク データ ストレージ」
を参照してください。
ENGINE
テーブル
オプションはテーブルにストレージ
エンジンを指定します。
ENGINE
テーブル
オプションは、次のテーブルに表されているストレージ
エンジン名を利用します。
ストレージ エンジン | 説明 |
ARCHIVE |
アーカイブ ストレージ エンジン詳しくは
項13.10. 「ARCHIVE ストレージエンジン」
を参照してください。 |
CSV |
カンマで区切られた値のフォーマットで行を格納するテーブル詳しくは
項13.11. 「CSV ストレージエンジン」
を参照してください。 |
EXAMPLE |
例エンジン詳しくは 項13.8. 「EXAMPLE ストレージエンジン」
を参照してください。 |
FEDERATED |
リモート テーブルにアクセスするストレージ
エンジン詳しくは
項13.9. 「FEDERATED ストレージエンジン」
を参照してください。 |
HEAP |
これは MEMORY の同義語です。 |
ISAM (OBSOLETE) |
MySQL 5.1
では無効です。もし古いバージョンから
MySQL 5.1
にアップグレードするなら、その作業の
前に 全ての既存
ISAM テーブルを
MyISAM
に変換しなければいけません。 |
InnoDB |
行ロックと外部キーを持つトランザクション セーフ
テーブル詳しくは 項13.5. 「InnoDB ストレージ エンジン」
を参照してください。 |
MEMORY |
このストレージ
エンジンのデータはメモリの中だけに格納されます。詳しくは
項13.7. 「MEMORY (HEAP )
ストレージエンジン」
を参照してください。 |
MERGE |
1つのテーブルとして利用される MyISAM
テーブルの集まり。また、MRG_MyISAM
としても知られています。詳しくは
項13.6. 「MERGE ストレージエンジン」
を参照してください。 |
MyISAM |
MySQL に利用されるデフォルト ストレージ
エンジンであるバイナリ ポータブル
ストレージ エンジン。詳しくは
項13.4. 「MyISAM ストレージエンジン」
を参照してください。 |
NDBCLUSTER |
クラスタ化された、耐障害性の、メモリ
ベースのテーブル。また、NDB
としても知られています。詳しくは
章 14. MySQL Cluster
を参照してください。 |
もし適応しないストレージ
エンジンが指定されると、MySQL
は代わりにデフォルト
エンジンを利用します。通常は
MyISAM
です。例えば、テーブル定義が
ENGINE=INNODB
オプションを含み、MySQL サーバが
INNODB
テーブルをサポートしなければ、そのテーブルは
MyISAM
テーブルとして作成されます。これは、トランザクショナル
テーブルをマスタ上に持つが、スレーブ上に作成されたテーブルが非トランザクショナルである場合(スピードを速める為)の複製設定を可能にします。
MySQL 5.1 では、ストレージ
エンジン仕様が支持されていなければ警告が表示されます。
注意:古い
TYPE
オプションは
ENGINE
と同義語です。MySQL 4.0
以降、TYPE
は廃止されましたが、MySQL 5.1 (MySQL 5.1.7
となる予定)ではまだ後方互換性の為にサポートされています。MySQL
5.1.8
より、警告が表示されるようになりました。これはMySQL
5.2
では廃止される予定です。新しいアプリケーションの中では
TYPE
は利用するべきではありません、また、代わりに
ENGINE
を利用する為に、既存アプリケーションの変換を今すぐ始めるべきです。.(詳しくは
項C.1.9. 「Changes in release 5.1.8 (Not released)」 を参照してください。)
その他のテーブル
オプションはテーブルの動作を最適化する為に利用されます。ほとんどの場合、それらのうちのどれも指定する必要はありません。これらのオプションは、指示されない限り全てのストレージ
エンジンに適応します。与えられたストレージ
エンジンに適応しないオプションは、受け入れられ、テーブル定義の一部として記憶されるでしょう。そのようなオプションは、後程もし異なるストレージ
エンジンの利用の為にテーブルを変換する時
ALTER TABLE
を利用すれば適応されます。
AUTO_INCREMENT
テーブルの初期 AUTO_INCREMENT
値。MySQL 5.1 では、これは
MyISAM
、MEMORY
、そして
InnoDB
テーブルに対して機能します。これはまた、MySQL
5.1.6 以降も ARCHIVE
テーブルに対しても機能します。
AUTO_INCREMENT
テーブル
オプションをサポートしないエンジンに最初の自動インクリメント値を設定する為に、テーブルを作成した後、求められる値よりの1少ない値の
「dummy」
行を挿入し、その後ダミー行を削除してください。
CREATE TABLE
ステートメント内の
AUTO_INCREMENT
テーブル
オプションをサポートするエンジンには、AUTO_INCREMENT
値をリセットする為に ALTER TABLE
を利用する事もできます。その値は、現在カラム内にある最大値よりも小さく設定する事はできません。
tbl_name
AUTO_INCREMENT =
N
AVG_ROW_LENGTH
テーブルの平均行長近似値です。可変サイズ行を持つ大きいテーブルに対してのみ、これを設定する必要があります。
MyISAM
テーブルを作成する時、MySQL
はテーブルが最終的にどの程度の大きさになるのかを決める為に
MAX_ROWS
と
AVG_ROW_LENGTH
オプションの製品を利用します。もしどちらのオプションも指定しなければ、テーブルの最大サイズはデフォルトで256
TB になります。(もし使用している OS
がその大きさのファイルをサポートしていなければ、テーブル
サイズはファイル
サイズ制限に制約されます。)もし大きいファイルが必要無く、インデックスを小さく早くする為にポインタサイズを小さくしたければ、myisam_data_pointer_size
システム変数を設定する事でデフォルトのポインタ
サイズを小さくする事ができます。(詳しくは
項4.2.3. 「システム変数」
をご確認ください。)もし全てのテーブルをデフォルトの制限よりも大きくする事を希望し、必要以上にテーブルが遅く、大きくなっても良いのであれば、この変数を設定する事でデフォルトのポインタサイズを増やす事ができます。
[DEFAULT] CHARACTER SET
テーブルにデフォルト文字セットを指定します。CHARSET
は CHARACTER SET
の同義語です。
CHECKSUM
MySQL に全ての行のライブ
チェックサムを維持させたければこれを1に設定してください。(これはテーブルが変更される度に
MySQL
が自動的に更新するチェックサムです。)これはテーブルの更新スピードを少し遅くしますが、壊れたテーブルを見つけるのが早くなります。CHECKSUM
TABLE
ステートメントはチェックサムをリポートします。(MyISAM
のみです。)
COLLATE
テーブルにデフォルト照合を指定します。
COMMENT
最高60文字のテーブルに対するコメントです。
CONNECTION
FEDERATED
テーブルの接続文字列です。(注意:MySQL
の古いバージョンは COMMENT
オプションを接続文字列に利用していました。)
DATA DIRECTORY
、INDEX
DIRECTORY
DATA
DIRECTORY='
か directory
'INDEX
DIRECTORY='
を利用する事で、directory
'MyISAM
ストレージ エンジンがテーブルのデータ
ファイルとインデックス
ファイルをどこに置く必要があるのかを指定する事ができます。ディレクトリは、相対パス名ではなくフルパス名でなければいけません。
これらのオプションは
--skip-symbolic-links
オプションを利用していない時だけ機能します。OS
にはまた、有効なスレッド セーフな
realpath()
コールがなければいけません。詳細については、項6.6.1.2. 「Unix 上のテーブルに対するシンボリックリンクの使用」
をご参照ください。
DELAY_KEY_WRITE
キー更新をテーブルが閉じられる時まで遅らせたければこれを1に設定してください。項4.2.3. 「システム変数」
内の delay_key_write
システム変数についての説明を参照してください。(MyISAM
のみです。)
INSERT_METHOD
もしデータを MERGE
テーブルに挿入したければ、その行が挿入されるべきテーブルのINSERT_METHOD
を利用して指定する必要があります。INSERT_METHOD
は MERGE
テーブルにのみ有効なオプションです。最初か最後のテーブルに挿入する為には
FIRST
か LAST
値を、また挿入を防ぐ為には
NO
値を利用してください。詳しくは
項13.6. 「MERGE
ストレージエンジン」
を参照してください。
KEY_BLOCK_SIZE
このオプションはインデックス キー
ブロックに利用するサイズについてストレージ
エンジンにヒントを提供します。このエンジンは必要に応じて値を変更する事が可能です。0という値は、デフォルト値を利用しなければいけないという事を表しています。テーブル値を無効にする為に、個々のインデックス定義はそれ自身の
KEY_BLOCK_SIZE
値を指定する事ができます。KEY_BLOCK_SIZE
は MySQL 5.1.10 で追加されました。
MAX_ROWS
テーブル内に格納する予定の最大行数。これは、厳しい制限というよりは、ストレージ エンジンに対して、テーブルが少なくてもこの程度の行数を格納できる必要があるという事を表すヒントのような物です。
MIN_ROWS
テーブル内に格納する予定の最小行数
PACK_KEYS
PACK_KEYS
は MyISAM
テーブルとだけ効果を発揮します。小さいインデックスを持ちたければ、このオプションを1に設定してください。これは通常更新スピードを遅くし、読み込みを早くします。オプションを0に設定すると、全てのキー
パッキングが無効になります。これを
DEFAULT
に設定すると、ストレージ
エンジンには長い CHAR
や
VARCHAR
カラムだけをパックするように指令が出ます。
もし 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
の情報に関しては、http://dev.mysql.com/doc/refman/4.1/en/create-table.html
を参照してください。
ROW_FORMAT
行がどのように格納されるべきかを定義します。MyISAM
テーブルに対しては、静的、または可変長行フォーマットのオプション値は
FIXED
か DYNAMIC
になり得ます。 myisampack
はタイプを COMPRESSED
に設定します。詳しくは
項13.4.3. 「MyISAM
テーブルストレージフォーマット」
を参照してください。
InnoDB
テーブルに対しては、行はデフォルトでコンパクト
フォーマットに格納されます。(ROW_FORMAT=COMPACT
)ROW_FORMAT=REDUNDANT
を指定する事により、MySQL
の古いバージョンで利用される非コンパクト
フォーマットをリクエストする事もできます。
UNION
UNION
は、同一の
MyISAM
テーブルの集まりを1つの物としてアクセスしたい時に利用する事ができます。これは
MERGE
テーブルとのみ機能します。詳しくは
項13.6. 「MERGE
ストレージエンジン」
を参照してください。
MERGE
テーブルにマップするテーブルに、SELECT
、UPDATE
、そして
DELETE
権限を持たなければいけません。(注意:以前は、全てのテーブルは、MERGE
テーブルそのものと同じデータベース内にある必要がありました。この制限はもう適応されません。)
partition_options
は CREATE
TABLE
を利用して作成されたテーブルの領域確保をコントロールする為に利用できます。重要:このセクションの冒頭で紹介された
partition_options
の構文内に表された全てのオプションが、全ての領域確保タイプに有効であるわけではありません。テーブル作成と
MySQL
領域確保に関係する他のステートメントの追加例だけでなく、MySQL
内での領域確保の機能と使用に関しての完全な情報については、各タイプの情報仕様の為の個別タイプをリストした物、そして
章 15. パーティショニング を見てください。
partition_options
は、もし利用されるなら最小の PARTITION
BY
条項を含む必要があります。この条項はパーティションを決めるのに利用される関数を含んでいます。その関数は、num
が分割数の時、1から num
の整数値を返します。(1つのテーブルが含むユーザー定義パーティションの最高数は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
の残りを利用します。追加情報については
項15.2.3. 「HASH
パーティショニング」
を参照してください。
LINEAR
キーワードは異なるアルゴリズムを若干必要とします。lこの場合、行が格納されるパーティション数は、1つ、または複数の論理的な
AND
操作の結果計算されます。線形ハッシングについての説明と例に関しては、
項15.2.3.1. 「LINEAR HASH
パーティショニング」
を参照してください。
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
によって分割されたテーブルと同じ効果を持ちます。これは、分割数はモジュールではなく
&
演算子を利用して求められるという事を意味します。(詳細に関しては
項15.2.3.1. 「LINEAR HASH
パーティショニング」、と
項15.2.4. 「KEY
パーティショニング」
を参照してください。)この例は、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
は許されません。(バグ
#15890)
各パーティションは
partition_definition
条項を利用して個別に定義されるでしょう。この条項を形成するそれぞれの部分は次のような物です。
PARTITION
:これはパーティションの論理名を指定します。
partition_name
VALUES
条項:範囲の領域確保に関しては、各パーティションが
VALUES LESS THAN
条項を含む必要があり、リストの領域確保に関しては、各パーティションに対して
VALUES IN
条項を指定する必要があります。これは、どの行がこのパーティションに格納されるのかという事を決める為に利用されます。構文例に関しては、章 15. パーティショニング
のパーティション
タイプに関する説明を参照してください。
任意の COMMENT
条項はパーティションを説明する為に利用されるでしょう。.このコメントは単一引用句で始まらなければいけません。例:
COMMENT = 'Data for the years previous to 1999'
DATA DIRECTORY
と INDEX
DIRECTORY
は、このパーティションのデータとインデックスがそれぞれどこに格納されるのかを指示する為に利用されます。
to 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つのデータ ディレクトリとインデックス ディレクトリが指定されます。もし指定されなければ、データとインデックスはデフォルトで MySQL データ ディレクトリに格納されます。
パーティション内に格納する行の最大、最小数をそれぞれ指定する為に
MAX_ROWS
と MIN_ROWS
が利用されます。max_number_of_rows
と min_number_of_rows
の値は正整数でなければいけません。同名のテーブル
レベル
オプションと同様に、これらはサーバに対してただの
「提案」
として機能し、厳しい制限ではありません。
任意の TABLESPACE
条項は、パーティションのテーブルスペースを指定するのに利用されるでしょう。MySQL
クラスタにのみ利用されます。
任意の [STORAGE] ENGINE
条項は、この MySQL
サーバにサポートされたエンジンであるこのパーティション内のテーブルが、指定されたストレージ
エンジンを利用するように機能します。STORAGE
キーワードとイコールのサイン(=
)
の両方は任意です。もしこのオプションを利用して、パーティションを特定するストレージ
エンジンが設定されなければ、テーブル全体に適応するエンジンがこのパーティションで利用されます。
注意:領域確保ハンドラは
PARTITION
と
SUBPARTITION
の両方に対して
[STORAGE] ENGINE
オプションを受け入れます。現在これを利用する唯一の方法は、全てのパーティション、サブ
パーティションを同じストレージ
エンジンに設定する事です。もし同じテーブル内で、パーティション、サブ
パーティションに異なるストレージ
エンジンを設定しようとするとエラーが発生します。エラー
1469 (HY000): MySQL
のこのバージョンではパーティション内でハンドラを混在させる事は許可されていません。
.
将来の MySQL 5.1
リリース時には、領域確保に関するこの制限を取り除く予定です。
NODEGROUP
オプションは
node_group_id
によって確認されたノード
グループの一部としてこのパーティションを機能させる為に利用できます。このオプションは
MySQL クラスタに対してだけ利用可能です。
パーティション定義は、1つかそれ以上の
subpartition_definition
条項を含みます。これらはそれぞれ、name
が識別子のサブ パーティションである
SUBPARTITION
の最小値で構成されます。name
SUBPARTITION
を利用した PARTITION
キーワードの入れ替え以外は、サブ
パーティション定義の構文はパーティション定義の構文と同一です。
サブ パーティションは HASH
か
KEY
によって行われなけれる必要があり、そして
RANGE
か LIST
パーティション上のみで行われます。詳しくは
項15.2.5. 「サブパーティショニング」
を参照してください。
パーティションは修正し、マージし、テーブルに追加し、テーブルからドロップする事ができます。これらのタスクを成し遂げる為の基本的な
MySQL
ステートメントについての情報は、項12.1.2. 「ALTER TABLE
構文」
を参照してください。更なる詳細説明や例に関しては、項15.3. 「パーティショニング管理」
を参照してください。
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
カラムになる事ができます。
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;
元テーブルの中で指定されたカラム属性やインデックスを含む、他のテーブルの定義に基づき空のテーブルを作成するには、LIKE
を利用してください。
CREATE TABLEnew_tbl
LIKEorig_tbl
;
コピーは元テーブルと同じバージョンのテーブル ストレージ フォーマットを利用して作成されます。
CREATE TABLE ... LIKE
は、元テーブルに対して、または外部キー定義に対して指示された
DATA DIRECTORY
や INDEX
DIRECTORY
テーブル
オプションを保管しません。
ユニーク
キー値を複製する行をどのように扱うかを指示する為に、IGNORE
か REPLACE
によって
SELECT
を先行させる事ができます。IGNORE
利用すると、ユニーク
キー値上に既存の行を複製する新しい行は廃棄されます。REPLACE
を利用すると、新しい行は同じユニーク
キー値を持つ行を置き換えます。もし
IGNORE
も REPLACE
も指示されなければ、複製ユニーク
キー値はエラーになります。
バイナリ
ログが元テーブルを再作成する為に利用できる事を保障する為に、MySQL
は CREATE TABLE ... SELECT
の最中の並列挿入を許可しません。