CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [select_statement] または CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(] LIKE old_tbl_name [)]; create_definition: col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [[PRIMARY] KEY] [COMMENT 'string'] [reference_definition] | [CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,...) | KEY [index_name] (index_col_name,...) | INDEX [index_name] (index_col_name,...) | [CONSTRAINT [symbol]] UNIQUE [INDEX] [index_name] (index_col_name,...) | FULLTEXT [INDEX] [index_name] (index_col_name,...) | [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) [reference_definition] | CHECK (expr) type: TINYINT[(length)] [UNSIGNED] [ZEROFILL] | SMALLINT[(length)] [UNSIGNED] [ZEROFILL] | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL] | INT[(length)] [UNSIGNED] [ZEROFILL] | INTEGER[(length)] [UNSIGNED] [ZEROFILL] | BIGINT[(length)] [UNSIGNED] [ZEROFILL] | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL] | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL] | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL] | DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL] | NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL] | CHAR(length) [BINARY | ASCII | UNICODE] | VARCHAR(length) [BINARY] | DATE | TIME | TIMESTAMP | DATETIME | TINYBLOB | BLOB | MEDIUMBLOB | LONGBLOB | TINYTEXT | TEXT | MEDIUMTEXT | LONGTEXT | ENUM(value1,value2,value3,...) | SET(value1,value2,value3,...) index_col_name: col_name [(length)] [ASC | DESC] reference_definition: REFERENCES tbl_name [(index_col_name,...)] [MATCH FULL | MATCH PARTIAL] [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: TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM } | AUTO_INCREMENT = # | AVG_ROW_LENGTH = # | CHECKSUM = {0 | 1} | COMMENT = 'string' | MAX_ROWS = # | MIN_ROWS = # | PACK_KEYS = {0 | 1 | DEFAULT} | PASSWORD = 'string' | DELAY_KEY_WRITE = {0 | 1} | ROW_FORMAT = { DEFAULT | DYNAMIC | FIXED | COMPRESSED } | RAID_TYPE = { 1 | STRIPED | RAID0 } RAID_CHUNKS=# RAID_CHUNKSIZE=# | UNION = (table_name,[table_name...]) | INSERT_METHOD = { NO | FIRST | LAST } | DATA DIRECTORY = 'absolute path to directory' | INDEX DIRECTORY = 'absolute path to directory' | DEFAULT CHARACTER SET character_set_name [COLLATE collation_name] select_statement: [IGNORE | REPLACE] [AS] SELECT ... (Some legal select statement)
CREATE TABLE
では、指定した名前のテーブルが作成されます。
使用可能なテーブル名の規則は、項6.1.2. 「データベース名、テーブル名、インデックス名、カラム名、エイリアス名」
で説明しています。
デフォルトでは、テーブルはカレントデータベースに作成されます。
テーブルがすでに存在する場合、カレントデータベースがない場合、またはデータベースが存在しない場合には、エラーが発生します。
MySQL バージョン 3.22 以降では、テーブル名を
db_name.tbl_name
の形式で指定することで、指定したデータベースにテーブルを作成することができます。
これは、カレントデータベースの有無にかかわらず有効です。
MySQL バージョン 3.23
以降では、テーブルの作成時に
TEMPORARY
キーワードを指定することができます。テンポラリテーブルは現在の接続の間のみ有効で、接続が閉じると自動で削除されます。そのため、異なる
2
つの接続が同じテンポラリテーブル名を使用できます。この場合、それぞれの接続のテンポラリテーブル間でコンフリクトが発生したり、同名の既存のテーブルとの間でコンフクリトが発生したりすることはありません(既存のテーブルはテンポラリテーブルが削除されるまで表示されません)。MySQL
4.0.2
以降では、テンポラリテーブルの作成には、CREATE
TEMPORARY TABLES
権限が必要です。
MySQL バージョン 3.23 以降では、キーワード
IF NOT EXISTS
を使用して、テーブルがすでに存在する場合に発生するエラーを回避することができます。注意:
既存のテーブルの構造が、CREATE
TABLE
ステートメントで指定されたテーブルの構造と同じかどうかは検証されません。
バージョン 4.1.0 以降では、属性
SERIAL
を BIGINT NOT NULL
AUTO_INCREMENT UNIQUE
のエイリアスとして使用できます。これは互換性を考慮した機能です。
MySQL 3.23 以降では、CREATE TABLE
ステートメントの最後に SELECT
ステートメントを追加することによって、1
つのテーブルから別のテーブルを作成することができます。
CREATE TABLE new_tbl SELECT * FROM orig_tbl;
インデックスは新しいテーブルに持ち越されません。また、一部のカラム型の変換が行われる場合があります。たとえば、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;
MySQL 4.1 以降では、生成されるカラムの型を明示的に指定することができます。
CREATE TABLE foo (a tinyint not null) SELECT b+1 AS 'a' FROM bar;
MySQL 4.1 では、LIKE
でも、別のテーブルの定義に基づいて新しいテーブル(元のテーブルのカラム属性やインデックスをすべて含む)を作成することができます。
CREATE TABLE new_tbl LIKE orig_tbl;
CREATE TABLE ... LIKE
では、元のテーブルに指定された DATA
DIRECTORY
や INDEX DIRECTORY
のテーブルオプションはいずれもコピーされません。
データベースディレクトリ内の一部のファイルには、各テーブルの
tbl_name
が反映されます。MyISAM
型のテーブルの場合、次のようになります。
ファイル | 用途 |
tbl_name.frm |
テーブル形式(定義)ファイル |
tbl_name.MYD |
データファイル |
tbl_name.MYI |
インデックスファイル |
さまざまなカラム型の特性の詳細については、項6.2. 「カラム型」 を参照してください。
NULL
も NOT NULL
も指定されていない場合、カラムは
NULL
が指定されているときと同じように処理される。
整数型カラムは追加属性
AUTO_INCREMENT
を持つことができる。 インデックス付きの
AUTO_INCREMENT
カラムに
NULL
(推奨)または
0
を挿入すると、そのカラムには連続値の次の値が設定される。
通常、これは value+1
になる(value
はテーブルに現在格納されているそのカラムの最大値)。
AUTO_INCREMENT
は 1
から開始される。 See
項11.1.3.32. 「mysql_insert_id()
」。
MySQL 4.1.1 以降では、--sql-mode
サーバオプションまたは
sql_mode
サーバ変数に対して
NO_AUTO_VALUE_ON_ZERO
フラグを指定することによって、新しい連続値を生成する代わりに、AUTO_INCREMENT
カラムに 0
を 0
として格納することができる。 See
項4.1.1. 「mysqld
コマンドラインオプション」。
AUTO_INCREMENT
カラムの最大値が入ったレコードを削除した場合、その値は
ISAM
テーブルや
BDB
テーブルでは再利用されるが、MyISAM
テーブルや InnoDB
テーブルでは再利用されない。DELETE
FROM table_name
(WHERE
節なし)を AUTOCOMMIT
モードで実行してテーブル内のすべてのレコードを削除した場合、InnoDB
を除くすべてのテーブル型で、連続値が初めから開始される。
See 項7.5.12.5. 「InnoDB での AUTO_INCREMENT
カラムの仕組み」。
注意:
AUTO_INCREMENT
カラムはテーブルごとに 1
つだけ存在できる。このカラムにはインデックスを付ける必要があり、また
DEFAULT
値は設定できない。 MySQL
バージョン 3.23
では、AUTO_INCREMENT
カラムは、正の値だけを持つ場合にのみ正しく機能する。負の数値が挿入されると、その値はきわめて大きな正数としてみなされる。
これは、数値が正の数から負の数に
``折り返す''
ときに発生する精度の問題を回避するためと、0
が入った AUTO_INCREMENT
カラムが誤って取得されないようにするためである。
MyISAM
テーブルと
BDB
テーブルでは、複合インデックスで
AUTO_INCREMENT
セカンダリカラムを指定できる。 See
項3.6.9. 「AUTO_INCREMENT
の使用」。
MySQL と一部の ODBC
アプリケーションとの互換性を確保するため、最後に挿入されたレコードの
AUTO_INCREMENT
値を次のクエリで検出することができる。
SELECT * FROM tbl_name WHERE auto_col IS NULL
TIMESTAMP
型カラムでは、他のカラム型とは異なる方法で
NULL
値が処理される。TIMESTAMP
型カラムには、NULL
は格納できない。カラムに NULL
を挿入すると、カラムの値として現在の日時が設定される。TIMESTAMP
型のカラムはこのように動作するため、NULL
属性と NOT NULL
属性は通常どおりには適用されず、それらを指定しても無視される。
その一方で、TIMESTAMP
型のカラムを MySQL
クライアントにとって使用しやすくするために、サーバは、(実際には、TIMESTAMP
型カラムには NULL
値は格納されないにもかかわらず)TIMESTAMP
型カラムについて、NULL
値の割り当てが可能(true)と報告する。DESCRIBE
tbl_name
を使用してテーブルに関する記述を取得すると、これを確認できる。
注意: TIMESTAMP
型のカラムに、値として 0
を設定するのは、NULL
を設定するのとは異なる。0
は
TIMESTAMP
型の有効な値である。
DEFAULT
値は定数でなければならず、関数や式を使用することはできない。
DEFAULT
値が指定されていない場合、そのカラムには、次の方法で、MySQL
によって DEFAULT
値が自動的に割り当てられる。
値として NULL
を取れるカラムの場合、デフォルト値は
NULL
になる。
NOT NULL
として宣言されているカラムの場合、デフォルト値はそれぞれのカラム型によって決まる。
AUTO_INCREMENT
属性を持つと宣言されていない数値型カラムの場合、デフォルトは
0
。AUTO_INCREMENT
カラムの場合、デフォルト値は連続値の次の値になる。
TIMESTAMP
型以外の日付と時刻型の場合、デフォルトはその型に対応するゼロ値。テーブル内の最初の
TIMESTAMP
型カラムのデフォルト値は、現在の日時になる。
See 項6.2.2. 「日付と時刻型」。
ENUM
型以外の文字列型の場合、デフォルト値は空の文字列。ENUM
の場合、デフォルト値は最初の列挙値になる。
デフォルト値は定数でなければならない。したがって、日付カラムのデフォルト値として、NOW()
や CURRENT_DATE
などの関数を設定することはできない。
COMMENT
オプションでは、カラムに関するコメントを指定することができる。
コメントは SHOW CREATE TABLE
ステートメントと SHOW FULL
COLUMNS
で表示される。
このオプションは MySQL 4.1
から利用可能(それ以前のバージョンでは、使用は可能だが無視される)。
KEY
は、通常 INDEX
のシノニム。 バージョン 4.1 以降、キー属性
PRIMARY KEY
は単に
KEY
として指定することもできる。この機能は他のデータベースとの互換性を考慮して実装された。
MySQL では、UNIQUE
キーには重複のない値以外は格納できない。
既存のレコードのキーと同じキーを持つ新しいレコードを追加しようとすると、エラーが発生する。
PRIMARY KEY
は、すべてのキーカラムが NOT
NULL
として定義されていなければならないユニーク
KEY
である。NOT
NULL
として明示的に定義されていないと、暗黙的(かつ自動的)に
NOT NULL
に設定される。MySQL
において、このキーは PRIMARY
と呼ばれる。個々のテーブルは PRIMARY
KEY
を 1 つだけ持つことができる。
PRIMARY KEY
がない場合に、何らかのアプリケーションがテーブルの
PRIMARY KEY
を要求すると、MySQL
では、NULL
カラムをまったく持たない最初の
UNIQUE
キーが PRIMARY
KEY
として返される。
複合インデックスを PRIMARY KEY
にすることもできる。しかし、カラムの仕様で
PRIMARY KEY
キー属性を使用して複合インデックスは作成することはできない。そのようにしても、単一のカラムがプライマリとしてマークされるにすぎない。
この場合、別に PRIMARY KEY(index_col_name,
...)
節を使用する必要がある。
UNIQUE
インデックスでは、インデックスのすべての値に重複がない状態でなければならない。ただし、例外として、そのインデックスのカラムの
1 つで NULL
値が格納可能な場合、複数の
NULL
値を格納できる。
この例外は BDB
型のテーブルには適用されない。BDB
型のテーブルには単一の NULL
のみ格納可能。
PRIMARY
キーまたは
UNIQUE
キーが単一のカラムで構成されていて、そのカラム型が整数型の場合、そのキーは
_rowid
として参照することもできる(バージョン
3.23.11 の新機能)。
PRIMARY KEY
でないインデックスに名前を割り当てないと、そのインデックスは
index_col_name
の最初のカラム名と同じ名前が割り当てられ、そのインデックスを一意(ユニーク)なものとするためのオプションのサフィックス(_2
、_3
、...
)が付けられる。テーブルのインデックス名は
SHOW INDEX FROM tbl_name
を使用して確認できる。 See
項4.6.8.1. 「データベース、テーブル、カラム、およびインデックスに関する情報の取得」。
NULL
値を持つことができるカラムに対するインデックスの作成は、MyISAM
、InnoDB
、BDB
の各テーブル型でのみサポートしている。その他のテーブルでは、カラムが
NOT NULL
と宣言されていないとエラーになる。
インデックスの指定で
col_name(length)
構文を使用することによって、CHAR
型または VARCHAR
型カラムの最初から length
に指定した長さのバイトのみを使用するインデックスを作成できる。この方法で、インデックスファイルのサイズをかなり小さくすることができる。
See 項5.4.4. 「カラムインデックス」。
BLOB
型と TEXT
型のカラムのインデックスの作成は、MyISAM
テーブルと(MySQL 4.0.14
以降の)InnoDB
テーブルでのみサポートしている。BLOB
型または TEXT
型のカラムにインデックスを付けるときには、インデックスの長さ(最大
255
バイト)を必ず指定する必要がある。次に例を示す。
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
index_col_name
の指定では、最後に ASC
または
DESC
を付けることができる。
これらのキーワードは、昇順または降順によるインデックス値の格納を指定できるようにする今後の拡張に対応している。現時点では、これらのキーワードは解析されるが無視される。インデックス値は常に昇順で格納される。
TEXT
型または BLOB
型のカラムで ORDER BY
または
GROUP BY
が使用されていると、サーバは、最初の部分の、
max_sort_length
サーバ変数が示す数のバイトのみを使用して値をソートする。
See 項6.2.3.2. 「BLOB
型と TEXT
型」。
MySQL バージョン 3.23.23 以降では、特殊な
FULLTEXT
インデックスも作成できる。これは全文検索に使用される。FULLTEXT
インデックスは、MyISAM
テーブルでのみサポートしている。このインデックスは、CHAR
型、VARCHAR
型、TEXT
型のカラムからのみ作成できる。
インデックスの作成は常にカラム全体に対して行われる。部分的なインデックスの作成は行われない。処理の詳細については、項6.8. 「MySQL 全文検索」
を参照。
MySQL バージョン 3.23.44
以降では、InnoDB
テーブルで外部キー制約のチェックをサポートしている。See
項7.5. 「InnoDB
テーブル」。 注意:
InnoDB
での FOREIGN
KEY
構文は上に示した構文より制限されている。参照テーブルのカラム名は、必ず明示的に指定する必要がある。
InnoDB では、MySQL
3.23.50以降、外部キーに対する ON
DELETE
アクションを、また MySQL 4.0.8
以降では ON UPDATE
アクションをサポートしている。
正確な構文については、このマニュアルの
InnoDB
のセクションを参照。 See
項7.5.5.2. 「FOREIGN KEY
制約」。
他のテーブル型については、MySQL サーバは
CREATE TABLE
コマンドの
FOREIGN
KEY
、CHECK
、REFERENCES
の各構文を解析するが、それ以上の処理は行わない。
See 項1.8.4.5. 「外部キー」。
MyISAM
テーブルと
ISAM
テーブルの場合、各
NULL
カラムは 1
ビット余分に使用して、最も近いバイトに切り上げられる。
バイトでの最大レコード長は次のように計算される。
レコード長 = 1 + (カラム長の合計) + (NULL カラムの数 + delete_flag + 7)/8 + (可変長カラムの数)
静的レコード形式のテーブルでは、delete_flag
は
1。静的テーブルでは、行レコードで、そのレコードが削除されたものであるかを示すフラグ用に
1
ビットが使用される。動的テーブルでは、このフラグは可変長レコードの頭に格納されるため、delete_flag
は 0 になる。
これらの計算は InnoDB
テーブルには適用されない。InnoDB
テーブルでは、NULL
カラムの格納サイズは NOT NULL
カラムと比較して変わらない。
table_options
オプションと
SELECT
オプションは MySQL
バージョン 3.23 以降でのみ実装されている。
テーブル型を指定する TYPE
オプションは次の値を取る。
テーブル型 | 説明 |
BDB または BerkeleyDB
|
ページのロックを行う、トランザクションセーフテーブル。
See 項7.6. 「BDB または BerkeleyDB
テーブル」。 |
HEAP |
このテーブルのデータはメモリにしか格納されない。
See 項7.4. 「HEAP テーブル」。 |
ISAM |
元のストレージエンジン。 See 項7.3. 「ISAM テーブル」。 |
InnoDB |
行ロックを行う、トランザクションセーフテーブル。
See 項7.5. 「InnoDB テーブル」。 |
MERGE |
1 つのテーブルとして使用される MyISAM
テーブルの集まり。 See
項7.2. 「MERGE テーブル」。 |
MRG_MyISAM |
MERGE のエイリアス。 |
MyISAM |
ISAM
に代わる、バイナリの移植が可能な新しいストレージエンジン。
See 項7.1. 「MyISAM テーブル」。 |
See 章 7. MySQL のテーブル型。
テーブル型が指定されているときに、そのテーブル型が使用できない場合、MySQL
では、代わりに MyISAM
が使用される。 たとえば、テーブル定義に
TYPE=BDB
オプションが含まれているときに、BDB
型のテーブルを MySQL
サーバでサポートしていない場合、テーブルは
MyISAM
テーブルとして作成される。そのため、マスタにトランザクションテーブルがありながら、スレーブでは非トランザクションテーブルを作成する(速度を上げるため)といった、レプリケーション設定が可能になる。MySQL
4.1.1
では、指定したテーブル型が受け付けられないと警告が出力される。
その他のテーブルオプションは、テーブルの動作を最適化するために使用される。ほとんどの場合、これらはいずれも指定しなくてよい。 これらのオプションは、特に断りがない限り、すべてのテーブル型に適用される。
オプション | 説明 |
AUTO_INCREMENT |
テーブルに設定する次の AUTO_INCREMENT
値(MyISAM
テーブルのみ。InnoDB
テーブルの最初の AUTO_INCREMENT
値を設定するには、1
つ少ない値を持つダミーレコードを挿入し、後からそのダミーレコードを削除する)。 |
AVG_ROW_LENGTH |
テーブルのレコードの長さの平均の近似値。可変サイズレコードを持つ大きなテーブル以外では、この値を設定する必要はない。 |
CHECKSUM |
すべてのローのチェクサムを MySQL
に維持させるには、この値を 1
に設定する(それにより、テーブルの更新速度はやや遅くなるが、破損したテーブルを見つけやすくなる)(MyISAM
テーブルのみ)。 |
COMMENT |
テーブルに関する、60 文字のコメント。 |
MAX_ROWS |
テーブルに格納する予定の最大レコード数。 |
MIN_ROWS |
テーブルに格納する予定の最小レコード数。 |
PACK_KEYS |
インデックスのサイズを小さくするには、この値を 1
に設定する。通常、それにより、更新速度が遅くなるが、読み取りは速くなる(MyISAM
テーブルと ISAM
テーブルのみ)。この値を 0
に設定すると、キーのパックがすべて無効化される。この値を
DEFAULT
に設定すると(MySQL 4.0
の場合)、ストレージエンジンによって、CHAR
型または VARCHAR
型の長いカラムのみがパックされる。 |
PASSWORD |
パスワードを使用して .frm
ファイルを暗号化する。標準の MySQL
バージョンでは、このオプションを指定しても何も行われない。 |
DELAY_KEY_WRITE |
テーブルが閉じられるまでキーテーブルの更新を遅らせるには、この値を1
に設定する(MyISAM
テーブルのみ)。 |
ROW_FORMAT |
レコードの格納方法を定義する。現在、このオプションは、形式として
DYNAMIC と
FIXED をサポートしている
MyISAM
テーブルに対してのみ機能する。 See
項7.1.2. 「MyISAM テーブル形式」。 |
MyISAM
テーブルの使用時には、MySQL
で、MAX_ROWS * AVG_ROW_LENGTH
の積によって、結果のテーブルがどれくらいのサイズになるかの計算が行われる。上記のオプションのどれも指定しないと、テーブルの最大サイズは
4G(使用しているオペレーティングシステムで
2G
のテーブルしかサポートされていないときは
2G)になる。その理由は、単に大きなファイルが必要でない場合に、ポインタのサイズを抑制することによって、インデックスをより小さく、より迅速化することにある。
PACK_KEYS
を指定しないと、デフォルトでは、文字列のパックのみ行われ、数値のパックは行われない。PACK_KEYS=1
と指定すると、数値もパックされる。
バイナリ数値キーのパック時には、MySQL
によってプリフィックスの圧縮が行われる。
つまり、これによって大きな利益を得られるのは、同じ数値が数多く存在する場合に限られる。プリフィックスの圧縮では、前のキーの何バイトが次のキーと同じであるかを示す追加の
1 バイトが各キーで必要になる(注意:
圧縮のパフォーマンスを良くするため、キーの直後に、レコードのポインタが上位バイトから下位バイトの順に格納される)。したがって、連続する
2
つのレコードに同じキーが数多くあるとき、通常、``同じ''
キーの後に続くものはいずれも 2
バイト(レコードのポインタも含めて)しか取らない。それに比べて通常の場合は、後に続くキーで
storage_size_for_key + pointer_size 分(通常 4
バイト)必要になる。その一方、すべてのキーがまったく異なる場合は、NULL
値を持てない各キーで 1
バイト余分に使用される(この場合、パックされたキーの長さは、キーが
NULL
であるかどうかを示すバイトと同じバイトに格納される)。
MySQL 3.23 以降では、CREATE
ステートメントの後に SELECT
を指定すると、SELECT
のすべての要素に対応する新しいフィールドが
MySQL によって作成される。次に例を示す。
mysql>CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,
->PRIMARY KEY (a), KEY(b))
->TYPE=MyISAM SELECT b,c FROM test2;
この場合、a、b、c の 3 つのカラムを持つ
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
では、インデックスの作成は自動では行われない。これは、このコマンドをできるだけ柔軟なものにするためである。作成するテーブルにインデックスが必要な場合は、SELECT
ステートメントの前にインデックスを指定する。
mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
テーブルへのデータのコピー時にエラーが発生した場合、データは自動で削除される。
SELECT
の前に
IGNORE
または
REPLACE
を付けることで、ユニークキー値が重複するレコードの処理方法を指定できる。
IGNORE
の場合、新しいレコードのユニークキー値が既存のレコードの値と重複していると、その新しいレコードは破棄される。REPLACE
の場合、新しいレコードによって、同じユニークキー値を持つ既存のレコードが置換される。IGNORE
と REPLACE
のどちらも指定していない場合、ユニークキー値の重複が検出されるとエラーになる。
更新ログやバイナリログを使用して元のテーブルを確実に再作成できるようにするため、MySQL
では CREATE TABLE ... SELECT
実行中の同時挿入は行えない。
RAID_TYPE
オプションでは、大きなファイルをサポートしていないオペレーティングシステムで
MyISAM
データファイル(インデックスファイルではなく)に対する
2G または 4G
の制限を超すことができる。注意:
このオプションは大きなファイルをサポートしているファイルシステムでは推奨されない。
異なる物理ディスク上に RAID
ディレクトリを配置することによって I/O
のボトルネックを迅速化することができる。RAID_TYPE
はあらゆるオペレーティングシステムで機能するが、MySQL
のコンフィギャを --with-raid
として行っておく必要がある。現時点で使用可能な
RAID_TYPE
は
STRIPED
(1
と
RAID0
はこのエイリアス)。
MyISAM
テーブルに対して
RAID_TYPE=STRIPED
と指定すると、データベースディレクトリに、00、01、02
という RAID_CHUNKS
サブディレクトリが MyISAM
によって作成される。これらのディレクトリのそれぞれで、table_name.MYD
が MyISAM
によって作成される。データファイルへのデータの書き込み時、RAID
ハンドラによって、最初の
RAID_CHUNKSIZE
*1024
バイトが最初のファイルにマップされ、次の
RAID_CHUNKSIZE
*1024
バイトが次のファイルにマップされる(以下同様)。
UNION
は、同一テーブルのコレクションを 1
つのものとして使用する場合に指定する。これは、MERGE
テーブルに対してのみ機能する。 See
項7.2. 「MERGE
テーブル」。
現在のところ、MERGE
テーブルにマップするテーブルに対する
SELECT
、UPDATE
、DELETE
の各権限が必要になる。
マップ対象のテーブルはいずれも
MERGE
テーブルと同じデータベースに存在しなければならない。
MERGE
テーブルにデータを挿入するには、レコードの挿入先とするテーブルを
INSERT_METHOD
で指定する必要がある。
INSERT_METHOD
は
MERGE
テーブルのみに使用できるオプションである。See
項7.2. 「MERGE
テーブル」。このオプションは MySQL
4.0.0 で導入された。
作成されたテーブルでは、最初に
PRIMARY
キーが置かれ、続いてすべての
UNIQUE
キー、通常キーの順に配置される。そのため、MySQL
オプティマイザで使用するキーを優先させることができ、また重複する
UNIQUE
キーをより迅速に検出できる。
DATA DIRECTORY='directory'
または
INDEX DIRECTORY='directory'
を使用することによって、ストレージエンジンのデータファイルとインデックスファイルの格納場所を指定できる。注意:
この directory
には、対象のディレクトリのフルパス(相対パスではなく)を指定する。
これは、MySQL
4.0
において、--skip-symlink
オプションは指定しないときの
MyISAM
テーブルに対してのみ機能する。 See
項5.6.1.2. 「Unix 上のテーブルに対するシンボリックリンクの使用」。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.