スキーマとはデータベースをさらに分割するためのグループである。
テーブルなどはあるスキーマに所属し、正式名称はスキーマ名.テーブル名となる。
スキーマ名が省略された場合は後述。
ただし物理的なフォルダと対応しているわけではなく、完全に概念的である。
データベース
スキーマ
スキーマ
データベース
スキーマ
スキーマ
スキーマ名は省略することができる。
省略されると、SEARCH_PATHパラメータにしたがってスキーマ名を補完する。
t1テーブルを削除しておく。
oddtbs=> drop table t1;
DROP TABLE
search_pathパラメータを確認。
oddtbs=> show search_path;
search_path
----------------
"$user",public
(1 row)
※ $userはログインしているユーザー名で今はoduser。ただしその名前のスキーマは存在していない。
CREATE SCHEMA スキーマ名;
次のSQLをファイルとして作成。(myschm181.sql)
ログイン画面から実行。
oddtbs=> \i myschm181.sql
...
SELECTで確認。
oddtbs=> select * from myschm.t1; num | data -----+-------- 1 | myschm 2 | myschm (2 rows) ※ myschm.t1はmyschmスキーマのt1テーブルを意味する。 oddtbs=> select * from t1; ERROR: relation "t1" does not exist ※ スキーマ名が省略されると、SEARCH_PATHに従ってoduser, publicの順に検索するが見つからない。
現時点でoduserスキーマがないので、スキーマ名を省略してテーブルを作成するとpublicスキーマになる。
次のSQLをファイルとして作成。(public181.sql)
ログイン画面から実行。
oddtbs=> \i public181.sql
...
SELECTで確認。
oddtbs=> select * from t1; num | data -----+-------- 1 | public 2 | public (2 rows) oddtbs=> select * from public.t1; 結果は上と同じ。 ※ 現時点では、t1はpublicスキーマのt1のことを意味している。
oduserスキーマを作成すると、スキーマ名を省略してテーブルを作成するとoduserスキーマになる。
次のSQLをファイルとして作成。(oduser181.sql)
ログイン画面から実行。
oddtbs=> \i oduser181.sql
...
SELECTで確認。
oddtbs=> select * from t1; num | data -----+-------- 1 | oduser 2 | oduser (2 rows) ※ この時点で、t1はoduserスキーマのt1のことを意味するようになった。 oddtbs=> select * from public.t1; num | data -----+-------- 1 | public 2 | public (2 rows) ※ もちろんpublicスキーマのt1はちゃんと残っている。 oddtbs=> select * from myschm.t1; num | data -----+-------- 1 | myschm 2 | myschm (2 rows) ※ myschmスキーマのt1も同様。
ログイン画面から実行。
oddtbs=> set search_path to myschm, public; SET oddtbs=> show search_path; search_path ---------------- myschm, public (1 row)
SELECTで確認。
oddtbs=> select * from t1; num | data -----+-------- 1 | myschm 2 | myschm (2 rows) ※ この時点で、t1はmyschmスキーマのt1のことを意味するようになった。 oddtbs=> select * from public.t1; num | data -----+-------- 1 | public 2 | public (2 rows) ※ もちろんpublicスキーマのt1はちゃんと残っている。 oddtbs=> select * from oduser.t1; num | data -----+-------- 1 | oduser 2 | oduser (2 rows) ※ oduserスキーマのt1も同様。
t1テーブルを削除。
oddtbs=> drop table t1;
DROP TABLE
※ 削除されたt1はmyschmスキーマのt1のはず。
再度SELECTで確認。
oddtbs=> select * from t1; num | data -----+-------- 1 | public 2 | public (2 rows) ※ myschmスキーマにt1がないのでpublicスキーマのt1が検索された。 oddtbs=> select * from myschm.t1; ERROR: relation "myschm.t1" does not exist ※ myschmスキーマのt1が削除されている。
ログイン画面から実行。
oddtbs=> drop schema oduser cascade; ... oddtbs=> set search_path to default; SET oddtbs=> show search_path; search_path ---------------- "$user",public (1 row)