CREATE SCHEMA — 新しいスキーマを定義する
CREATE SCHEMAschema_name
[ AUTHORIZATIONrole_specification
] [schema_element
[ ... ] ] CREATE SCHEMA AUTHORIZATIONrole_specification
[schema_element
[ ... ] ] CREATE SCHEMA IF NOT EXISTSschema_name
[ AUTHORIZATIONrole_specification
] CREATE SCHEMA IF NOT EXISTS AUTHORIZATIONrole_specification
ここでrole_specification
は以下の通りです。user_name
| CURRENT_ROLE | CURRENT_USER | SESSION_USER
CREATE SCHEMA
を実行すると、現在のデータベースに新しいスキーマが登録されます。
スキーマ名は、現在のデータベースにある既存のスキーマとは異なる名前にする必要があります。
スキーマは、本質的には名前空間です。
スキーマには、名前付きオブジェクト(テーブル、データ型、関数、および演算子)が含まれます。
これらのオブジェクトの名前は、他のスキーマに存在する他のオブジェクトの名前と重複しても構いません。
名前付きオブジェクトには、スキーマ名を接頭辞としてオブジェクト名を「修飾」するか、必要なスキーマを含んだ検索パスを設定することによってアクセスできます。
修飾なしのオブジェクト名を指定したCREATE
コマンドは、そのオブジェクトの現在のスキーマ(current_schema
関数で決定される検索パスの先頭部分)で作成されます。
CREATE SCHEMA
には、オプションとして、新しいスキーマ内でオブジェクトを作成するためのサブコマンドを付加することができます。
サブコマンドは、本質的にはスキーマ作成後に発行される別コマンドと同じように扱われます。
ただし、AUTHORIZATION
句を使用した場合、作成された全てのオブジェクトの所有者が指定したユーザになるという点で異なっています。
schema_name
作成するスキーマの名前です。
省略された場合、user_name
がスキーマ名として使用されます。
スキーマ名をpg_
から始めることはできません。
このような名前はシステムスキーマ用に予約されているためです。
user_name
新しいスキーマを所有するユーザのロール名です。
省略された場合、デフォルトでは、コマンドを実行したユーザになります。
他のロールを所有者とするスキーマを作成するためには、そのロールに対してSET ROLE
ができなければなりません。
schema_element
そのスキーマ内で作成されるオブジェクトを定義するSQL文です。
現在、CREATE SCHEMA
内では、CREATE TABLE
、CREATE VIEW
、CREATE INDEX
、CREATE SEQUENCE
、CREATE TRIGGER
、およびGRANT
のみが句として使用可能です。
他の種類のオブジェクトは、スキーマ作成後に個別のコマンドを使えば作成できます。
IF NOT EXISTS
同じ名前のスキーマがすでに存在する場合に(注意を発生する以外)何も行いません。
このオプションを使用する場合にはschema_element
副コマンドを含めることはできません。
スキーマを作成するには、実行するユーザが現在のデータベースにおけるCREATE
権限を持っている必要があります。
(もちろん、スーパーユーザにはこの制限はありません。)
スキーマを作成します。
CREATE SCHEMA myschema;
joe
ユーザ用にスキーマを作成します。
このスキーマの名前はjoe
になります。
CREATE SCHEMA AUTHORIZATION joe;
test
という名前のスキーマがすでに存在していなければ、joe
ユーザによって所有されるtest
という名前のスキーマを作成します。
(joe
が既存のスキーマの所有者であるかどうかは関係ありません。)
CREATE SCHEMA IF NOT EXISTS test AUTHORIZATION joe;
スキーマを作成し、その中にテーブルとビューを作成します。
CREATE SCHEMA hollywood CREATE TABLE films (title text, release date, awards text[]) CREATE VIEW winners AS SELECT title, release FROM films WHERE awards IS NOT NULL;
個々のサブコマンドがセミコロンで終わっていないことに注意してください。
以下は、上述のコマンドと等価であり、同じ結果をもたらします。
CREATE SCHEMA hollywood; CREATE TABLE hollywood.films (title text, release date, awards text[]); CREATE VIEW hollywood.winners AS SELECT title, release FROM hollywood.films WHERE awards IS NOT NULL;
標準SQLでは、CREATE SCHEMA
でDEFAULT CHARACTER SET
句を使用できます。
また、現在PostgreSQLで使用できるよりも多くのサブコマンドを使用できます。
標準SQLでは、CREATE SCHEMA
のサブコマンドを任意の順序で記述できます。
現在のPostgreSQLの実装では、サブコマンドにおいて下方参照ができない場合があります。
そのため、下方参照を避ける目的で、サブコマンドの順序を並べ替える必要が生じる可能性もあります。
標準SQLでは、スキーマの所有者は、常にそのスキーマ内の全てのオブジェクトを所有します。
PostgreSQLでは、スキーマ所有者以外のユーザが所有するオブジェクトを、スキーマに含めることができます。
このような状態は、スキーマ所有者が、そのスキーマでのCREATE
権限を他のユーザに与えた場合やスーパーユーザがその中にオブジェクトを作成した場合にのみ発生します。
IF NOT EXISTS
オプションはPostgreSQLの拡張です。