インデックスを作成する(CREATE INDEX文, ALTER TABLE文)
MySQL では CREATE INDEX 文および ALTER TABLE 文を使ってインデックスおよび UNIQUE インデックスを作成することができます。ここでは MySQL でインデックスを作成する方法について解説します。
なおテーブル作成時に同時に作成する方法については「UNIQUE制約(ユニーク制約を設定する)」と「テーブル作成時にインデックスを作成する(INDEX)」を参照されてください。
(Last modified: )
目次
CREATE INDEX 文を使ってインデックスを作成する
CREATE INDEX 文を使ってインデックスを作成する方法です。書式は次の通りです。
CREATE INDEX index_name ON tbl_name (col_name, ...)
インデックス名( index_name )と対象となるテーブル名( tbl_name )とカラム名( col_name )を指定してインデックスを作成します。複数のカラムが含まれる場合は、カンマ(,)で区切り続けて記述してください。
それでは実際にインデックスを作成してみます。先に対象となるテーブルを次のように作成しました。
create table user(id int, name varchar(10));
作成したテーブルの id カラムを対象にインデックスを作成します。次のように実行します。
create index id_index on user(id);
インデックスが作成されました。
作成されたインデックスを確認してみます。
show index from user\G
作成されたインデックスは Non_unique が 1 となっておりインデックスを作成した対象のカラムでは重複した値を格納することができます。また Null が YES となっており NULL を格納することもできます。
-- --
それでは元になったテーブルにいくつかデータを追加してみます。
insert into user values(1, 'Yamada');
insert into user values(3, 'Suzuki');
insert into user values(1, 'Kudou');
insert into user values(NULL, 'Tachibana');
テーブルにデータを追加する時に、作成したインデックスの対象カラムに対して既に格納済みの値を重複した値を格納してもエラーとはなりませんでした。また NULL を格納することもできました。このようにインデックスを作成しただけでは、その対象となるカラムに制約は追加されません。
CREATE INDEX 文を使ってUNIQUEインデックスを作成する
UNIQUE インデックスを作成すると対象となるカラムに重複する値を格納することができなくなります。UNIQUE インデックスを作成する場合の書式は次の通りです。
CREATE UNIQUE INDEX index_name ON tbl_name (col_name, ...)
インデックス名( index_name )と対象となるテーブル名( tbl_name )とカラム名( col_name )を指定してインデックスを作成します。複数のカラムが含まれる場合は、カンマ(,)で区切り続けて記述してください。
それでは実際に UNIQUE インデックスを作成してみます。先に対象となるテーブルを次のように作成しました。
create table user(id int, name varchar(10));
作成したテーブルの id カラムを対象に UNIQUE インデックスを作成します。次のように実行します。
create unique index id_index on user(id);
UNIQUE インデックスが作成されました。
作成されたインデックスを確認してみます。
show index from user\G
作成されたインデックスは Non_unique が 0 となっておりインデックスを作成した対象のカラムでは重複した値を格納することができません。また Null が YES となっており NULL を格納することはできます。
-- --
それでは元になったテーブルにいくつかデータを追加してみます。
insert into user values(1, 'Yamada');
insert into user values(3, 'Suzuki');
insert into user values(NULL, 'Tachibana');
テーブルにデータを追加する時に、作成したインデックスの対象カラムに対して NULL を格納することもできました。
こんどは作成した UNIQUE インデックスの対象カラムに、既に格納されている他のデータの値と同じ値のデータを追加してみます。
insert into user values(3, 'Inoune');
Duplicate entry '値' for key 'インデックス名' というエラーが発生しデータを追加することができませんでした。このように UNIQUE インデックスを作成すると、インデックスの対象カラムには重複した値を格納できなくなります。
なお UNIQUE インデックスを作成しても NULL だけは対象のカラムに重複して格納することができます。次のデータをテーブルに追加したあとで、テーブルからデータを取得してみます。
insert into user values(NULL, 'Katayama');
UNIQUE インデックスに対象カラムであっても、 NULL については重複してもエラーとなることはありません。
ALTER TABLE 文を使ってインデックスを作成する
ALTER TABLE 文を使ってインデックスを作成する方法です。書式は次の通りです。
ALTER TABLE tbl_name ADD INDEX [index_name] (col_name, ...)
対象となるテーブル名( tbl_name )とカラム名( col_name ) および インデックス名( index_name )を指定してインデックスを作成します。(インデックス名は省略可能です)。複数のカラムが含まれる場合は、カンマ(,)で区切り続けて記述してください。
それでは実際にインデックスを作成してみます。先に対象となるテーブルを次のように作成しました。
create table user(id int, name varchar(10));
作成したテーブルの id カラムを対象にインデックスを作成します。次のように実行します。
alter table user add index id_index (id);
インデックスが作成されました。
作成されたインデックスを確認してみます。
show index from user\G
作成されたインデックスは Non_unique が 1 となっておりインデックスを作成した対象のカラムでは重複した値を格納することができます。また Null が YES となっており NULL を格納することもできます。
ALTER TABLE 文を使ってUNIQUEインデックスを作成する
ALTER TABLE 文を使って UNIQUE インデックスを作成する方法です。書式は次の通りです。
ALTER TABLE tbl_name ADD UNIQUE INDEX [index_name] (col_name, ...)
対象となるテーブル名( tbl_name )とカラム名( col_name ) および インデックス名( index_name )を指定してインデックスを作成します。(インデックス名は省略可能です)。複数のカラムが含まれる場合は、カンマ(,)で区切り続けて記述してください。
それでは実際に UNIQUE インデックスを作成してみます。先に対象となるテーブルを次のように作成しました。
create table user(id int, name varchar(10));
作成したテーブルの id カラムを対象に UNIQUE インデックスを作成します。次のように実行します。
alter table user add unique index id_index (id);
UNIQUE インデックスが作成されました。
作成されたインデックスを確認してみます。
show index from user\G
作成されたインデックスは Non_unique が 0 となっておりインデックスを作成した対象のカラムでは重複した値を格納することができません。また Null が YES となっており NULL を格納することはできます。
-- --
CREATE INDEX 文および ALTER TABLE 文を使ってインデックスおよび UNIQUE インデックスを作成する方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
プログラミングや開発環境構築の解説サイトを運営しています。