PostgreSQLで使えるスキーマという階層の詳細を解説

PostgreSQLでは、データベースとテーブルの間にスキーマという階層があるのをご存じでしょうか。通常SQLを実行する際、データベース名を指定するとその下にある全てのテーブルが参照できてしまいます。

しかしスキーマを使えばテーブルをグループ分けしたり、同じ名称のテーブルを作ることも可能な便利な機能です。今回はこのようなPostgreSQLのスキーマという機能について紹介します。

そもそもスキーマとは

スキーマはPostgreSQLで使える機能の1つで、データベースとテーブルの間に位置する階層のようなものです。

しかしデフォルトのスキーマは自動で作られるうえスキーマ名を省略して使えるので、ITエンジニアとして長く働いているもののスキーマを意識したことがない、という方がいるかもしれません。

とはいえPostgreSQLでスキーマを使っていない、ということはPostgreSQLの便利な機能を使っていない、ということです。まずはスキーマとは何かについて解説します。

スキーマについてはこちらの記事でも詳しく解説しています。参照してください。
データベースとスキーマ

PostgreSQLのデータ構造

PostgreSQLでは階層構造によりデータを管理しています。具体的には最も外側にデータベースがあり、SQLを実行するにはデータベースを1つしか選べません。続いて今回紹介しているスキーマがあり、その中にテーブルを作れます。

さらにテーブルは同じ構造のレコードが集まったもので、レコードの中には複数のフィールドがあり、その中にデータが含まれています。この階層構造を簡単に記述すると次のように書くことができます。

データベース > スキーマ > テーブル > レコード > フィールド

このようにスキーマとは、データベースとテーブルの間にある階層です。

デフォルトのスキーマは省略できる

しかし、PostgreSQLを使ったことがある方なら、データベースを作ったら、すぐにその中でテーブルを作れたはずです。

これはPostgreSQLでデータベースを作成すると同時にpublicというスキーマが作成され、さらにスキーマ名を省略するとpublicスキーマの中にテーブルが作られるので、スキーマを意識しなくても利用できるからです。

例えばPostgreSQLの管理ツール「pgadmin」を利用してデータベースをクリックしてみてください。多くの属性等が表示されますが、その中にテーブルはありません。

スキーマ(schema)があるのでそれをクリックしてください。publicというスキーマがあり、その中にテーブルが格納されています。

スキーマでテーブルをグループ化

PostgreSQLでデータを管理する場合、最も外側のデータベースは1つしか選べません。しかし、アカウントや用途によってアクセスできるテーブルを制限したいケースはよくあります。

その場合、テーブル毎にアクセス権限を設定することも可能ですがスマートではありません。その点スキーマでグループ化すれば、もっとスマートな設定が可能です。

PostgreSQLでデータを管理するなら、ぜひスキーマをうまく活用してください。

スキーマの使い方

先ほど紹介したようにスキーマは便利な機能です。次からPostgreSQLのスキーマの使い方について紹介します。

SQLのスキーマの指定方法

スキーマの中に作成したテーブルを参照するSQLを作るには、テーブル名の前にスキーマ名を記述し、「.」で区切ります。

workスキーマの中のtable1テーブルを指定する例

スキーマ内のテーブルを使ったSQLの例

これは「work」というスキーマの中に作成したテーブル「table1」にレコードを追加し、そのデータを表示するSQLです。スキーマ内のテーブルの指定に「work.table1」を使っています。

publicスキーマ

先ほど紹介したようにPostgreSQLでデータベースを作成すると自動的にpublicというスキーマが作られます。そしてこのpublicスキーマは全てのユーザーがアクセス可能で、さらにスキーマ名を省略可能です。

publicスキーマを省略したSQLの例

上の例は、スキーマ名としてpublicを使った「public.table1」テーブルの全てのデータを表示するSQLと同じです。

publicスキーマを明示したSQLの例

PostgreSQLのスキーマの管理方法

これまで説明したようにPostgreSQLではデータベースの中に直接テーブルを作成するのではなく、スキーマを作ってその中にテーブルを作成します。

ただし、データベースを作ると自動的にpublicというスキーマが作られて、スキーマを指定しない場合、テーブルやビューなどはpublicの中に作られます。そのため、普段からPostgreSQLを使っているものの、スキーマの存在を忘れている方もいるかもしれません。

スキーマをうまく利用すれば、テーブルを効率良く管理できます。そのためにはスキーマを管理するSQLを知らなければなりません。次から、スキーマを管理するSQLの使い方を解説します。

スキーマを作る

スキーマを作成するにはSQLのCREATEコマンドを使います。なお、新規にスキーマを作成した際、その所有者を指定できるので、必要に応じて指定してください。

スキーマを作成するSQLの文法

CREATE SCHEMA スキーマ名;
CREATE SCHEMA スキーマ名 AUTHORIZATION アカウント名;

スキーマを作成する例

これはworkというスキーマを、workerというアカウントを所有者として作成する例です。なお作成後、PostgreSQLのクライアントから「\dn」コマンドでチェックできます。

スキーマの中にテーブルを作る

スキーマの中にテーブルを作成する場合、そのSQLでスキーマ名を指定したテーブル名を指定します。具体的には、先ほど紹介したようにテーブル名の前にスキーマ名をドットで指定してください。

スキーマ名付きのテーブル名を使った例

この例ではworkというスキーマの中にtable1というテーブルを作成します。テーブル名の「work.table1」に注目してください。

スキーマ名を変更する

スキーマ名を変更するにはスキーマの構成を変更するSQL、ALTER SCHEMAを使います。

スキーマ名を変更するSQLの文法
ALTER SCHEMA 対象のスキーマ名 RENAME TO 新しいスキーマ名;

スキーマを削除する

不要になったスキーマを削除することも可能です。なお、その場合は中にテーブルが無い状態でなければなりません。そしてスキーマを削除するにはDROP SCHEMAコマンドを使います。

スキーマを削除するSQLの文法
DROP SCHEMA 対象のスキーマ名

スキーマ間を移動するには

スキーマの中にあるテーブルを、別のスキーマに移動させることが可能です。なおスキーマを変更するには、テーブルの構成を変更するSQLのALTER TABLEコマンドを使用します。

スキーマを移動するSQL
ALTER TABLE 対象のテーブル名 SET SCHEMA 移動先のスキーマ名;

スキーマを移動するSQLの例

これはtestというスキーマの中にあるテーブルtable2を、workというスキーマの中に移動するためのSQLです。

なお、publicというスキーマは特殊でスキーマ名を省略できます。そのため、publicの中にあるテーブルを別のスキーマに移動する場合はpublicを省略可能です。

publicからworkにスキーマを移動するSQLの例

まとめ

これまで説明したようにPostgreSQLにはデータベースとテーブルの間にスキーマという階層があり、テーブルをグループ分けすることが可能です。

なおPostgreSQLでデータベースを作成した際、publicというスキーマが作られる、そのスキーマ名を省略できます。そのためスキーマを意識せずにPostgreSQLを利用している方も多いかもしれません。

スキーマを利用すれば同じ名称のテーブルを作れたり、アカウントによってアクセスできるテーブルを制限できるなど、データベースを管理するのに便利な機能です。ぜひ活用してください。

BLOGコンテンツをパーソナライズします

あなたは現在「プログラミング学習者」ですか?