powerdee.com
Google
 
このサイト内 Web
 
カウンタ

テーブル定義

インデックスへ戻る

CREATE DATABASE構文

MySQLのデータベースは、データディレクトリ(ここでは、/var/lib/mysql/data)下のディレクトリのこと。
以下の構文でデータベースを作成する。

CREATE DATABASE [IF NOT EXISTS] db_name

DROP DATABASE構文

以下の構文でデータベースを削除する。つまりデータディレクトリ下のディレクトリを中のファイル毎削除する。
全てのテーブルが削除されることになるので、十分注意すること。

DROP DATABASE [IF EXISTS] db_name

CREATE TABLE構文

テーブル名は、データベース名.テーブル名と指定するか、"USE データベース名"でデータベースを指定しておく。 なお、CREATE TABLE構文は複雑なので、一部省略している。

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] テーブル名 [(データ定義, ...)] [テーブルオプション] [SELECT構文]

データ定義

カラム定義及び列制約、表制約を定義する

カラム定義と列制約構文

データ定義は、カラム毎の定義とその後に宣言する制約定義がある。
以下はカラムの定義及び列制約構文

カラム名 データ型 [NOT NULL | NULL] [DEFAULT デフォルト値] [AUTO_INCREMENT] 
    [UNIQUE [KEY] | [PRIMARY] KEY]
    [COMMENT 'コメント']
    [リファレンス定義]

表制約構文

制約定義の"CONSTRAINT 制約名"とする場合と"INDEX インデックス名"というように制約名の指定の仕方が異なるので注意。
以下はプライマリーキーの指定となる。複合主キーは表制約構文でのみ定義が可能。

[CONSTRAINT [制約名]] PRIMARY KEY [USING {BTREE | HASH}] (インデックスカラム名,...) [インデックスオプション]

以下は、インデックスの定義

{INDEX|KEY} [インデックス名] [USING {BTREE | HASH}] (インデックスカラム名,...) [インデックスオプション]

[CONSTRAINT [制約名]] UNIQUE [INDEX|KEY] 
    [インデックス名] [USING {BTREE | HASH}] (インデックスカラム名,...) [インデックスオプション]

{FULLTEXT|SPATIAL} [INDEX|KEY] 
    [インデックス名] [USING {BTREE | HASH}] (インデックスカラム名,...) [インデックスオプション]

以下は、外部キー定義

[CONSTRAINT [外部キー名]] FOREIGN KEY [インデックス名] (インデックスカラム名,...) [リファレンス定義]

リファレンス定義

親テーブルの参照キーの値が更新(ON UPDATE)もしくは、削除(ON DELETE)した場合の挙動を選択できる。
RESTRICT(デフォルト)及びNO ACTIONは、制約違反としてエラーにする。
CASCADEは、更新時には子の外部キーも親と同じ値に更新し、削除時には子も一緒に削除する。
SET NULLは、更新/削除時に子の値をNULLにする。

REFERENCES 親テーブル名 [(親インデックスカラム名,...)]
    [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
    [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
    [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]

テーブルオプション

主にストレージエンジンを指定する。他にもさまざまなキーワードが指定可能だが、割愛する。

[TABLESPACE テーブルスペース名 STORAGE DISK] ENGINE [=] エンジン名

CREATE TABLE構文のキーワード


キーワード 説明
TEMPORARY TEMPORARYを指定した表は現在の接続の間のみ有効で接続が閉じると削除される
IF NOT EXISTS 同じ名前のテーブルが存在していたら、エラーとする
NOT NULL | NULL フィールドにNULLを許可するかどうかを指定する
PRIMARY KEYはNOT NULLとして定義されていなければならず、指定しない場合は暗黙的にNOT NULLに設定される
AUTO_INCREMENT 新しいレコードを追加した際に、自動的に行の最大値+1がセットされる
テーブルに1つだけ存在できる。このカラムにはインデックスを付ける必要があり、DEFAULT値は設定できない
詳細は、AUTO_INCREMENTについてを参照
UNIQUE [KEY] UNIQUE を宣言したフィールドは、すべてのレコードにおいてユニークな値を持つ必要がある
但し、NULLを許可している場合は複数のNULL値を格納できる
[PRIMARY] KEY 1テーブルにつき1つだけ指定できる。複合主キーの設定は表制約構文のPRIMARY KEYで指定する
列制約構文の場合KEYと指定するとPRIMARY KEYになる
表制約構文で"KEY"と指定すると、通常のINDEXとなるので注意
USING {BTREE | HASH} インデックスタイプを指定する。MyISAM及びInnoDBは、BTREEのみ指定可能(デフォルト)
ストレージエンジンがMEMORYもしくは、HEAPの場合は、BTREEとHASHを選択可能(デフォルトはHASH)
{INDEX|KEY} 表制約構文でKEYとは、INDEXのシノニムである。ここで指定したカラムでの検索では速度が向上する
{FULLTEXT|SPATIAL} MyISAMストレージエンジンのみが指定可能。
FULLTEXTを指定したカラムでは全文検索機能が利用できる。詳細はこちら
SPATIALの詳細は、こちら
エンジン名 ストレージエンジンを指定する。デフォルトはMyISAMだが、初期化パラメータファイル(my.cnf)に
"default-table-type=InnoDB"
のように指定することで変更可能

参考として、こちらのサンプルスキーマのテーブル定義を以下に示す。

CREATE TABLE IF NOT EXISTS demo_db.CATEGORY (
       CATEGORY_ID BIGINT NOT NULL AUTO_INCREMENT
     , PARENT_CATEGORY_ID BIGINT
     , NAME VARCHAR(32) NOT NULL
     , INSERT_DATE DATETIME
     , UPDATE_DATE DATETIME
     , DELETE_DATE DATETIME
     , CONSTRAINT PK_CATEGORY PRIMARY KEY (CATEGORY_ID)
     , INDEX IDX_CATEGORY_1 (PARENT_CATEGORY_ID)
     , CONSTRAINT FK_CATEGORY_1 FOREIGN KEY (PARENT_CATEGORY_ID)
           REFERENCES demo_db.CATEGORY (CATEGORY_ID)
           ON DELETE SET NULL ON UPDATE CASCADE
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS demo_db.ITEM (
       ITEM_ID BIGINT NOT NULL AUTO_INCREMENT
     , CATEGORY_ID BIGINT NOT NULL
     , NAME VARCHAR(32)
     , DESCRIPTION VARCHAR(128)
     , PRICE INT
     , INSERT_DATE DATETIME
     , UPDATE_DATE DATETIME
     , DELETE_DATE DATETIME
     , PRIMARY KEY (ITEM_ID)
     , INDEX (CATEGORY_ID)
     , CONSTRAINT FK_ITEM_1 FOREIGN KEY (CATEGORY_ID)
           REFERENCES demo_db.CATEGORY (CATEGORY_ID)
           ON UPDATE CASCADE
)ENGINE=InnoDB;

テーブル定義の変更

ALTER TABLEで既存のテーブル構造を変更することができる。

テーブル名の変更

ALTER TABLE テーブル名 RENAME TO 新テーブル名;

ストレージエンジンの変更

ALTER TABLE テーブル名 ENGINE=新しいストレージエンジン名;

列の追加

デフォルトだと、最後の列の次に追加されるが、FIRST/AFTERキーワードで特定のカラムの前後に追加できる。

ALTER TABLE テーブル名 ADD [COLUMN] 列名 カラム定義 [FIRST | AFTER カラム名];

列の削除

ALTER TABLE テーブル名 DROP [COLUMN] 列名;

列の変更

カラムのデータも可能な場合変換される。

ALTER TABLE テーブル名 MODIFY [COLUMN] カラム定義;
ALTER TABLE テーブル名 CHANGE [COLUMN] 旧カラム名 カラム定義;

テーブル定義に関するTips


作成したテーブルのSQLを確認する

以下のコマンドでテーブル作成時のSQL文を確認できる。

mysql> show create table demo_db.CATEGORY;

CREATE TABLE `CATEGORY` (
  `CATEGORY_ID` bigint(20) NOT NULL auto_increment,
  `PARENT_CATEGORY_ID` bigint(20) default NULL,
  `NAME` varchar(32) NOT NULL,
  `INSERT_DATE` datetime default NULL,
  `UPDATE_DATE` datetime default NULL,
  `DELETE_DATE` datetime default NULL,
  PRIMARY KEY  (`CATEGORY_ID`),
  KEY `IDX_CATEGORY_1` (`PARENT_CATEGORY_ID`),
  CONSTRAINT `FK_CATEGORY_1` FOREIGN KEY (`PARENT_CATEGORY_ID`) 
    REFERENCES `CATEGORY` (`CATEGORY_ID`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=cp932

データベース、テーブル名の大文字/小文字の区別

UNIX系OSの場合、デフォルトだとデータベース名やテーブル名の大文字/小文字が区別される。

mysql> desc demo_db.category;
ERROR 1146 (42S02): Table 'demo_db.category' doesn't exist
mysql> desc demo_db.CATEGORY;
+--------------------+-------------+------+-----+---------+----------------+
| Field              | Type        | Null | Key | Default | Extra          |
+--------------------+-------------+------+-----+---------+----------------+
| CATEGORY_ID        | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| PARENT_CATEGORY_ID | bigint(20)  | YES  | MUL | NULL    |                |
| NAME               | varchar(32) | NO   |     |         |                |
| INSERT_DATE        | datetime    | YES  |     | NULL    |                |
| UPDATE_DATE        | datetime    | YES  |     | NULL    |                |
| DELETE_DATE        | datetime    | YES  |     | NULL    |                |
+--------------------+-------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)

初期化パラメータファイル(my.cnf)に以下のように設定することで、全て小文字で判断されるようになる。
但し、設定前に大文字で作成したテーブルが設定後に見れなくなってしまうので注意

lower_case_table_names=1

参考

MySQL 5.1 Reference Manual Chapter13.SQL Statement Syntax
MySQL 4.1 リファレンスマニュアル 6.5データ定義


インデックスへ戻る



おすすめ書籍


現場で使える MySQL (DB Magazine SELECTION)

著者:松信 嘉範
出版社:翔泳社(2006-03-17)
価格:¥2,730(税込)
MySQL 徹底入門 第2版

著者:遠藤 俊裕、坂井 恵、館山 聖司、鶴長 鎮一、とみた まさひろ、班石 悦夫、松信 嘉範
出版社:翔泳社(2006-01-24)
価格:¥3,654(税込)


ページTopへ / ▲Homeへ