テーブル定義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)した場合の挙動を選択できる。
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構文のキーワード
参考として、こちらのサンプルスキーマのテーブル定義を以下に示す。
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] 列名; 列の変更カラムのデータも可能な場合変換される。 テーブル定義に関する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 おすすめ書籍
|