スキーマ

スキーマとはデータベースをさらに分割するためのグループである。
テーブルなどはあるスキーマに所属し、正式名称はスキーマ名.テーブル名となる。
スキーマ名が省略された場合は後述。
ただし物理的なフォルダと対応しているわけではなく、完全に概念的である。

データベース

スキーマ

テーブル
テーブル

スキーマ

テーブル
テーブル

データベース

スキーマ

テーブル
テーブル

スキーマ

テーブル
テーブル

SEARCH_PATHパラメータ

スキーマ名は省略することができる。
省略されると、SEARCH_PATHパラメータにしたがってスキーマ名を補完する。

  1. t1テーブルを削除しておく。

    oddtbs=> drop table t1;
    DROP TABLE
    
  2. search_pathパラメータを確認。

    oddtbs=> show search_path;
      search_path
    ----------------
     "$user",public
    (1 row)
    
    ※ $userはログインしているユーザー名で今はoduser。ただしその名前のスキーマは存在していない。
    

myschmスキーマ作成

CREATE SCHEMA スキーマ名;
  1. 次のSQLをファイルとして作成。(myschm181.sql)

    
    
  2. ログイン画面から実行。

    oddtbs=> \i myschm181.sql
    ...
    
  3. 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の順に検索するが見つからない。
    

publicスキーマ

現時点でoduserスキーマがないので、スキーマ名を省略してテーブルを作成するとpublicスキーマになる。

  1. 次のSQLをファイルとして作成。(public181.sql)

    
    
  2. ログイン画面から実行。

    oddtbs=> \i public181.sql
    ...
    
  3. SELECTで確認。

    oddtbs=> select * from t1;
     num |  data
    -----+--------
       1 | public
       2 | public
    (2 rows)
    
    oddtbs=> select * from public.t1;
    結果は上と同じ。
    
    ※ 現時点では、t1はpublicスキーマのt1のことを意味している。
    

oduserスキーマ作成

oduserスキーマを作成すると、スキーマ名を省略してテーブルを作成するとoduserスキーマになる。

  1. 次のSQLをファイルとして作成。(oduser181.sql)

    
    
  2. ログイン画面から実行。

    oddtbs=> \i oduser181.sql
    ...
    
  3. 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も同様。
    

search_pathパラメータ変更

  1. ログイン画面から実行。

    oddtbs=> set search_path to myschm, public;
    SET
    oddtbs=> show search_path;
      search_path
    ----------------
     myschm, public
    (1 row)
    
  2. 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も同様。
    
  3. t1テーブルを削除。

    oddtbs=> drop table t1;
    DROP TABLE
    
    ※ 削除されたt1はmyschmスキーマのt1のはず。
    
  4. 再度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)