1. はじめに

    ここでは,フィールドの属性(スキーマという)の設定方法や性質について述べます.
  2. 概略

    テーブル作成時にフィールドの属性(以下スキーマと表す)を設定することができます.表1にいくつかのスキーマを示します.
    表1:スキーマ一覧
    スキーマ 概要
    not null 値を必ず入れさせるようにします.
    auto_increment レコードを追加するたびにカウントアップした数値を自動的に入力します.IDを入力する場合に便利です.
    default 値が入力されなかった場合,defaultで指定した値が代入されます.
    index MySQLでは,データの検索時に高速動作させるため,索引をつけることができるが,それを作成するのに用います.
    欠点としては更新および追加時には速度低下を招く可能性があります.
    unique 唯一の値しか入力できなくします.言い換えれば,一度入力した値を再び入力するとエラーになります.
    primary key unique not nullと同じです.主キーに対して設定します.
    foreign key 外部キーに対して設定します.基本的には,外部キーの参照先を削除や変更を行うとエラーとなります.
  3. not null

    create table テーブル名 (フィールド名 型 not null, ... );
    フィールドの値として NULL を許可するかどうかを指定する.NOT NULLを指定したときは,フィールドの値として NULL を拒否する.下図のように,not nullと指定したフィールドに対してnullを入力しようとすると,エラーが発生する.
  4. auto_increment


    create table テーブル名 (フィールド名 型 auto_increment, ... );
    新しいレコードを挿入した際,自動的にフィールドの最大値+1 がセットされます.AUTO_INCREMENT を指定できるのは整数型のフィールドに対してだけです.また,AUTO_INCREMENT の値は 1からはじまります.注意しなければならないのは,auto_incrementを指定する場合には,unique,index,primary keyのいずれかを併せて指定する必要があることです.下図に例を示します.auto_incrementを指定したフィールドに対して,insert命令で0を3回入力していますが,select命令で表を表示するとそれぞれ別の値が入っていることがわかります.
  5. default


    create table テーブル名 (フィールド名 型 default デフォルト値, ... );
    レコード挿入時に default 宣言したフィールドに値が与えられなかった場合,default で指定した値が割り当てられます.下図にその例を示します.値を省略して入力するときには”default”とすればよいです.
  6. index


    create table テーブル名 (フィールド名 型 , ..., index(フィールド名, ...) );
    イ ンデックスを作成する.インデックスを作成したフィールドは,検索速度が向上する.indexの使用方法は,not nullやdefaultとは異なるので注意すること.具体的な例を下図に示す.この例では,show命令を用いてスキーマを表示しているが,”Key” 項目が”MUL”(マルチキー)となっていることに注目すること.
  7. unique


    ①create table テーブル名 (フィールド名 型 unique, ... );
    or
    ②create table テーブル名 (フィールド名 型,... ,unique(フィールド名,...) );
    unique を宣言したフィールドは,すべてのレコードにおいてユニークな値を持つ必要がある.既に存在する行と重複する値を持った行を挿入しようとした場合は,エ ラーが発生する.なお,uniqueは2つの書式が存在する.①を用いた例を下図に示す.フィールドaに同一の値を入力するとエラーが発生する.

    ② の書式を用いると,①の書式で行えること全てを実現できる.それに対して,②にしかできない制約がある.下に示した例では,aとbの組合せに対して uniqueとしている.つまり,a,bそれぞれについて着目してみると,同一の値を入れているにもかかわらずエラーとならない.しかしaとbの組合せで 同じ値が入力されるとエラーとなる.下図はその例である.

  8. primary key


    ①create table テーブル名 (フィールド名 型 primary key, ... );
    or
    ②create table テーブル名 (フィールド名 型,... ,primary key(フィールド名,...) );
    テー ブルのプライマリキーを指定する.プライマリキーはユニークな値を持ったフィールドである.primary key が定義されていないテーブルは,最初の unique キーが primary key として扱われる.また,not null制約が自動的に追加される.下図でその例を示す.

    primary keyにもuniqueと同様に2つの書式がある.②の書式では複数のフィールドが組み合わさって主キーとなる場合に用いることができる.下図にその例を示す.aおよびbそれぞれについて重複する値を入れてもエラーにはならないが,aとbの組合せが同じ場合にはエラーが発生している.

  9. foreign key


    create table テーブル名 (フィールド名 型, ..., foreign key (フィールド名) references 被参照テーブル名(被参照フィールド名)
    on delete {cascade|set null} on update {cascade|set null}, ... );
    テーブルの主キーと同じ値を持った別のテーブルのフィールド値のことを,外部キー(foreign key)と いう.MySQLのforeign keyを用いると被参照フィールド(参照されているフィールドであり,そのテーブルの主キー)に対して削除や変更を制限することができる.これにより,外 部キーと被参照フィールドとの不整合を防ぐことができる.まずforeign keyを用いないでMySQLによるテーブルを構築した場合の例を下に示す.

    こ の例では,id(主キー)とd1というフィールドを持つテーブルtest1と,fk(外部キー)とd2というフィールドを持つテーブルtest2を作成 し,それぞれデータを入力したとする.もしtest1のレコードが消されてしまうと,test2のfkに対応するものが無くなってしまう.結果として, joinしても下図のようになってしまう.

    これに対してforeign keyを用いる場合を下図にて示す.

    この後,test1のレコードを削除しようとすると,下図のようにエラーが発生する.これはtest1のidが被参照フィールドであるからである.このように,foreign keyを用いると不用意にデータを消去することを防ぐことができる.

    し かし,場合によっては本当に被参照テーブルを削除・更新を行いたい場合もある.そのような場合の対処を指定するのが,”on”である.下記に使用例を示 す.この場合,被参照フィールドが削除された場合,該当する外部キーのレコードを削除し,被参照フィールドが更新された場合,該当する外部キーも自動的に 修正する.

    実際に更新した例を下に示す.更新自体はtest1のidを1から5にしているが,注目すべきはtest2のfkについても変更がなされていることである.なお,”on”の後の句に”set null”と指定すると,当該フィールドがnullとなる.