(1) テーブル一覧表示
既定データベース上に存在するテーブル名を表示する。
※1表示されるテーブル名は場合により異なる。
※2下のDVDsはデータベース名。
mysql> SHOW TABLES;
+----------------+
| Tables_in_DVDs |
+----------------+
| lists |
+----------------+
1 rows in set (0.00 sec)
mysql>
(2) テーブル構成(フィールド)表示
テーブルの構成を表示する。
※1表示されるテーブル名等は場合により異なる。
※2下のlistsはテーブル名。
次の指定でも上記同様の表示がなされる。
mysql> SHOW FIELDS FROM lists;
+----------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | | PRI | NULL | auto_increment |
| title | varchar(250) | YES | | NULL | |
| original_title | varchar(255) | YES | | NULL | |
| detail | text | YES | | NULL | |
| director | varchar(255) | YES | | NULL | |
| actors | text | YES | | NULL | |
| price | decimal(8,0) | YES | | NULL | |
| add_time | datetime | YES | | NULL | |
| edit_date | timestamp(14) | YES | | NULL | |
+----------------+------------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)
mysql> DESCRIBE [Table名];
(3) テーブル作成
データベース上に、テーブルを新たに作成する。
テーブル作成時にフィールド構成を指定するので、あらかじめ、テーブルに載せる項目を決めておく必要がある。
テーブル名・フィールド名は、大文字小文字が区別される。
また、漢字も使用できる。
ただし、使用に際して、MySQL導入時のキャラクタセット指定(ビルドオプション指定)が必要。
※1原則、EUCコードで表現できる文字の範囲で名付けする。
※2下の例で、「Books」はテーブル名、「Id」「Title」「Price」「AddYMD」「EditYMD」はフィールド名
※3「AUTO_INCREMENT」とするテーブル項目は、「UNSIGNED」かつ「NOT NULL」の数値フィールドであること。
mysql> CREATE TABLE Books (
-> Id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
-> Title VARCHAR(255),
-> Price DECIMAL(8,0),
-> AddYMD DATE,
-> EditYMD TIMESTAMP
-> );
※4ストレージエンジンを指定してテーブルを作成する場合の例。
- MyISAM(既定):
CREATE TABLE Books ( Id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,Title VARCHAR(255),Price DECIMAL(8,0),AddYMD DATE,EditYMD TIMESTAMP ) TYPE = MyISAM ;- InnoDB:
CREATE TABLE Books ( Id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,Title VARCHAR(255),Price DECIMAL(8,0),AddYMD DATE,EditYMD TIMESTAMP ) TYPE = InnoDB ;【注意】Version 5.xでは ENGINE = InnoDB の様に指定する。
【参考】CREATE TABLE構文(4) テーブル構成の変更
テーブル項目(フィールド)を追加する。
mysql> ALTER TABLE [Table名] ADD [Field名] [Field属性] AFTER [既存Field名] ;
テーブル項目(フィールド)名又は属性を変更する。
mysql> ALTER TABLE [Table名] CHANGE [現Field名] [新Field名] [Field属性] ;
テーブル項目(フィールド)を削除する。
mysql> ALTER TABLE [Table名] DROP [Field名];
(5) テーブルの削除
テーブルを削除する。
mysql> DROP TABLE [Table名] ;
(6) INDEXの作成
a.テーブル項目(フィールド)毎にINDEXを作成
個別のテーブル項目(フィールド)に対してINDEXを作成する。
検索項目として使用頻度の高いテーブル項目に対してINDEXを作成すると、「WHERE」処理速度の向上が期待できる。
ただし、一般に、データレコード数が1,000以内の時は、大きな効果は無いと考えられている。
※1Index名は、対象テーブル項目(フィールド)名と同じでも、違っても良い。
※2デフォルトでは重複許可のINDEXが作られる。
※3PRIMARY KEYも重複非許可INDEXの一種。
mysql> CREATE INDEX [Index名] ON [Table名]([Field名]) ;
b.複数テーブル項目(フィールド)を連結してINDEX(複合インデックス)を作成
複数のテーブル項目(フィールド)を連結して、ひとつのINDEXを作成する。
テーブル項目毎にみるとデータが重複しているが、複数テーブル項目をつなげた時に重複非許可となる場合などに、効果が期待できる。
※上は重複非許可インデックスを作る場合。「UNIQUE」を外すと重複許可インデックスができる。
mysql> CREATE UNIQUE INDEX [Index名] ON [Table名]([Field名1],[Field名2]) ;
【参考】CREATE INDEX構文(7) INDEXの確認
テーブルの構成を表示する。
※1表示されるテーブル名等は場合により異なる。
※2下のlistsはテーブル名。
上の例では、テーブル項目「title」に対して重複可能インデックスが設定されている。
mysql> SHOW FIELDS FROM lists;
+----------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | | PRI | NULL | auto_increment |
| title | varchar(250) | YES | MUL | NULL | |
| original_title | varchar(255) | YES | | NULL | |
| detail | text | YES | | NULL | |
| director | varchar(255) | YES | | NULL | |
| actors | text | YES | | NULL | |
| price | decimal(8,0) | YES | | NULL | |
| add_time | datetime | YES | | NULL | |
| edit_date | timestamp(14) | YES | | NULL | |
+----------------+------------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)
※Key列に「MUL」とある表示。
次の指定でも上記同様の表示がなされる。
mysql> DESCRIBE [Table名];
更に詳細を表示をする場合。
mysql> SHOW INDEX FROM [Table名];
【参照】
「MySQL 4.1 リファレンスマニュアル :: 12.4.5.13 SHOW INDEX Syntax」
「MySQL 5.1 リファレンスマニュアル :: 12.5.4.17 SHOW INDEX 構文」
(8) INDEXの削除
INDEXを指定して削除する。
mysql> DROP INDEX [Index名] ON [Table名] ;
(9) VIEWの作成
VIEWを作成することにより、頻繁に使うSELECT文を簡略化することができる。
作成したVIEWは、Tableと同様に、SELECT構文で使用できる。
mysql> CREATE VIEW [View名] AS [SELECT構文] ;
例:
mysql> CREATE VIEW main AS
SELECT
Days.Id,
Days.Year,
Days.Month,
Days.Day,
Days.JD,
Days.MJD,
Days.Wareki_name,
Days.Wareki_name_kana,
Days.Wareki_gengo,
Days.Wareki_gengo_kana,
Days.Wareki_gengo_fuku,
Days.Wareki_year,
Days.Wareki_month,
Days.Wareki_day,
Eto.Eto AS Wareki_year_eto,
Days.Wareki_year_eto_no,
Eto1.Eto AS Wareki_month_eto,
Days.Wareki_month_eto_no,
Eto2.Eto AS Wareki_day_eto,
Days.Wareki_day_eto_no,
Sekki.Sekki AS Wareki_sekki,
Days.Wareki_sekki_no,
Days.AddDate,
Days.EditDate
FROM Days
LEFT JOIN (koyomi.Eto) ON (Days.Wareki_year_eto_no = Eto.Eto_no)
LEFT JOIN (koyomi.Eto1) ON (Days.Wareki_month_eto_no = Eto1.Eto_no)
LEFT JOIN (koyomi.Eto2) ON (Days.Wareki_day_eto_no = Eto2.Eto_no)
LEFT JOIN (koyomi.Sekki) ON (Days.Wareki_sekki_no = Sekki.Sekki_no)
;
【VIEWの一覧】 SELECT * FROM information_schema.VIEWS;
【VIEWの削除】 DROP VIEW [View名];
(10) テーブルロック
テーブルレベルで排他制御を行う※4。
ロックレベルには、READ(いわゆる共有ロック)とWRITE(いわゆる排他ロック)がある。
更に、READロックは、READとREAD LOCALがある。
ロックした処理(スレッド)のDB接続が切れると、DBMSによりロックは解除される。
- LOCK TABLES: テーブルをロックする。
- UNLOCK TABLES: テーブルロックを解除する。
【参照】
「MySQL 4.1 リファレンスマニュアル :: 6.7.5 LOCK TABLES および UNLOCK TABLES 構文」
「MySQL 4.1 リファレンスマニュアル :: 5.3.1 MySQL のテーブルロック方法」
mysql> LOCK TABLES [Table名] WRITE ;
※1テーブルロック時の「Table名」+「WRITE(ロックレベル)」は、カンマで区切って、複数を列挙できる。
mysql> LOCK TABLES Days WRITE, Eto READ, Gengo READ, Sekki READ ;
※2テーブルをロックする時には、ロックされるDB上の全テーブルについてロックレベル(READ,WRITE別)を指定しないと、後続のSQL文が実行不能となる。
mysql> UNLOCK TABLES ;
※3テーブルロック(WRITE)は、CGIで、かつ、DB書き込みを行う場合は、トラブル回避の意味で、必須である。
この場合、DBへの書き込み処理時だけでなく、通常書き込み前に行うデータ読み込み処理からロックをかけ、DBへの書き込み処理を終え、変更後読み取り処理後にロック解除を行うのがポイントである(一連の処理で1回だけロック/ロック解除を行う)。※4LOCK TABLESでテーブルロックを行うのは、非トランザクション型テーブル(MyISAM/ISAM)の場合である。
トランザクション型テーブル(InnoDB)の場合は、 SET AUTOCOMMIT=0 でオートコミットを無効にするか、又は、START TRANSACTION または BEGIN でトランザクションを開始ことにより、COMIT / ROLLBACKでトランザクションが終了するまで、行レベルロックが行われる。
「MySQL 4.1 リファレンスマニュアル :: 7.5.9. InnoDB トランザクションモデルとロック」※5MySQLの特徴は検索の高速性である。この特徴は、テーブルがMyISAM等の非トランザクション型テーブルにおいて著しい(逆に、トランザクション型テーブルを使用した場合は、「並み」といえる)。
トランザクション型テーブル使用を前提とするならば、使用ライセンス(例えば「MySQLをC言語から使う」)や実装されたデータベース機能などを考えると、Oracle(有償)やPostgreSQL(無償)等、他のデータベースにするのも一つの選択肢である。