インデックスを作成する(CREATE INDEX)

PostgreSQL では新しいインデックスを作成するために CREATE INDEX コマンドを使用します。ここでは PostgreSQL で新しいインデックスを作成する方法について解説します。

(Last modified: )

インデックスを作成する

インデックスを作成するには CREATE INDEX コマンドを使用します。基本となる書式は次の通りです。

CREATE INDEX [ name ] ON [ ONLY ] table_name
    ( column_name [, ...] )

テーブル( table_name )のカラム( column_name )を対象としたインデックスを作成します。インデックスの名前( name )は省略可能ですが、指定する場合にはスキーマは指定しないでください。インデックスは作成するテーブルと同じスキーマ上に作成されます。

-- --

それでは実際に試してみます。インデックスを作成するテーブルとして mydb データベースの中の myshema スキーマの中に次のようなテーブルを作成しました。

create table myschema.staff (
  id integer,
  name varchar(10),
  address varchar(10)
);

インデックスを作成する(1)

次に先ほど作成したテーブルの name カラムを対象としてインデックスを作成します。次のように実行してください。

create index on myschema.staff (name);

インデックスを作成する(2)

インデックスが作成されました。今回インデックス名は省略しているので、自動で適切なインデックス名が設定されています。

テーブルに対してインデックスを作成すると、 psql コマンドの \d コマンドを使ってテーブルのカラムの情報を取得した時に、作成されているインデックスの情報も表示されます。

\d myschema.staff

インデックスを作成する(3)

欄外に インデックス: "staff_name_idx" btree (name) と表示されています。これは作成されたインデックスの名前が 'staff_name_idx' 、使用しているインデックスの種類が 'btree' 、インデックスの対象となっているカラムが name カラムという意味になります。

-- --

インデックスは複数のカラムの組み合わせを対象に作成することもできます。先ほど作成したテーブルの name カラムと address カラムを対象にインデックスを作成します。次のように実行してください。

create index on myschema.staff (name, address);

インデックスを作成する(4)

インデックスが作成されました。それでは再度 \d コマンドを使ってテーブルのカラムに関する情報を取得してください。

インデックスを作成する(5)

先ほど作成したインデックスとは別に新しく 'staff_name_address_idx' という名前のインデックスが作成されています。このインデックスは使用しているインデックスの種類が 'btree' 、インデックスの対象となっているカラムが name カラムと address カラムの組み合わせになります。

UNIQUE インデックスを作成する

CREATE INDEX コマンドを実行する時に UNIQUE を指定すると UNIQUE インデックス(一意インデックス)を作成することができます。

CREATE UNIQUE INDEX [ name ] ON [ ONLY ] table_name
    ( column_name [, ...] )

UNIQUE インデックスを作成すると、対象となっているカラムに重複した値を格納することができなくなります( NULL は除く)。複数のカラムを対象にしている場合は、複数のカラムの値の組み合わせが重複している値を格納できなくなります。

-- --

それでは実際に試してみます。インデックスを作成するテーブルとして mydb データベースの中の myshema スキーマの中に次のようなテーブルを作成しました。

create table myschema.product (
  id integer,
  name varchar(10),
  weight integer
);

UNIQUE インデックスを作成する(1)

次に先ほど作成したテーブルの name カラムを対象として UNIQUE インデックスを作成します。次のように実行してください。

create unique index on myschema.product (name);

UNIQUE インデックスを作成する(2)

UNIQUE インデックスが作成されました。今回インデックス名は省略しているので、自動で適切なインデックス名が設定されています。

テーブルに対してインデックスを作成すると、 psql コマンドの \d コマンドを使ってテーブルのカラムの情報を取得した時に、作成されているインデックスの情報も表示されます。

\d myschema.product

UNIQUE インデックスを作成する(2)

UNIQUE インデックスの場合は、欄外に表示された作成済みのインデックス名の後に UNIQUE と表示されています。

-- --

なお UNIQUE インデックスはテーブルを作成するときに、対象となるカラムに UNIQUE 制約を設定しても自動で作成されます。例えば次のようにテーブルを作成したあとで、 psql メタコマンドの \d コマンドで作成したテーブルのカラムに関する情報を取得してみます。

create table myschema.product (
  id integer,
  name varchar(10) unique,
  weight integer
);

UNIQUE インデックスを作成する(3)

UNIQUE インデックスをあとから作成したのと同じようにテーブル作成時に自動で UNIQUE インデックスが作成されています。( UNIQUE 制約の詳細については「UNIQUE制約(カラムに格納される値がユニークな値かどうか)」を参照されてください)。

-- --

CREATE INDEX コマンドを使って新しいインデックスを作成する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。