個人的基準によるMySQLリファレンス


3.テーブルレベルの操作

(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」はフィールド名

 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
    -> );

 ※3「AUTO_INCREMENT」とするテーブル項目は、「UNSIGNED」かつ「NOT NULL」の数値フィールドであること。

 ※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を作成する。

テーブル項目毎にみるとデータが重複しているが、複数テーブル項目をつなげた時に重複非許可となる場合などに、効果が期待できる。

 mysql> CREATE UNIQUE INDEX  [Index名] ON [Table名]([Field名1],[Field名2]) ;

 上は重複非許可インデックスを作る場合。「UNIQUE」を外すと重複許可インデックスができる。


【参考】CREATE INDEX構文

(7) INDEXの確認

テーブルの構成を表示する。
 ※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  | 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)

上の例では、テーブル項目「title」に対して重複可能インデックスが設定されている。
 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ロックは、READREAD LOCALがある。
ロックした処理(スレッド)のDB接続が切れると、DBMSによりロックは解除される。
【参照】
 「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(無償)等、他のデータベースにするのも一つの選択肢である。

前へ  メニューへ  次へ

2011年08月14日更新
2010年12月07日更新
2010年10月15日更新