はじめに

MySQLならテーブル作成時にインデックスの作成も

create table staff(id int, name varchar(10), index id_index (id));

とかでできるが、postgresは?

と調べた時にできなそうということがわかったので書いておく

結論

できなそうだったので素直に

create table public.staff (id int, name varchar(10));
create index on staff(name);

というように2文に分けてやることにしている。

結論に至るまでにやったこと

軽くググる

調べてみると、少し古い記事だが下記のstack overflowの記事でも、

公式ドキュメントを引用しながら、create tableでインデックスで指定する方法はなさそうとの記載があった。 PostgreSQL: Can you create an index in the CREATE TABLE definition?

There doesn’t seem to be any way of specifying an index in the CREATE TABLE syntax.

この記事が引用している公式ドキュメント(8系)も参照してみると、プライマリーキーのindexは自動で生成されるとのことが記載されていた。

PostgreSQL automatically creates an index for each unique constraint and primary key constraint to enforce uniqueness. Thus, it is not necessary to create an index explicitly for primary key columns.

ドキュメントをみる

このとき使っていたのが11系だったので、11系のドキュメントも確認してみたのですが、

そこにも上で紹介した記事と同じことが書かれていた。

DB Client Toolなどでも試してみる

ドキュメントの量が膨大だと「見落としている」という可能性もなくはないと思い、

既にindexが作成されているtableのDDLをSQLクライアントツール(今回使ったのはDBeaver)が

生成するDDLを確認してみたりもした。

上図では、email columnにindex貼ったテーブルのDDLを確認しているのだが、やはりcreate tableとは別でcreate indexされていることがわかる。

SQLクライアントツールのDDLも2文になってるので、できないという結論で問題なさそう。