CREATE DATABASE — 新しいデータベースを作成する
CREATE DATABASEname
[ WITH ] [ OWNER [=]user_name
] [ TEMPLATE [=]template
] [ ENCODING [=]encoding
] [ STRATEGY [=]strategy
] [ LOCALE [=]locale
] [ LC_COLLATE [=]lc_collate
] [ LC_CTYPE [=]lc_ctype
] [ ICU_LOCALE [=]icu_locale
] [ ICU_RULES [=]icu_rules
] [ LOCALE_PROVIDER [=]locale_provider
] [ COLLATION_VERSION =collation_version
] [ TABLESPACE [=]tablespace_name
] [ ALLOW_CONNECTIONS [=]allowconn
] [ CONNECTION LIMIT [=]connlimit
] [ IS_TEMPLATE [=]istemplate
] [ OID [=]oid
]
CREATE DATABASE
は新しいPostgreSQLデータベースを作成します。
データベースを作成するには、スーパーユーザ、もしくはCREATEDB
という特別な権限を持つユーザである必要があります。
CREATE ROLEを参照してください。
デフォルトでは、新しいデータベースは標準システムデータベースtemplate1
を複製することによって作成されます。
他のテンプレートを指定するには、TEMPLATE
と記述します。
特に、name
TEMPLATE template0
と記述することで、そのバージョンのPostgreSQLによって定義済みの標準オブジェクトのみを持つ、(そこではユーザ定義オブジェクトは存在せず、システムオブジェクトは変更されていない)初期状態のデータベースを作ることができます。
これは、template1
に追加した独自オブジェクトをコピーしたくない場合に便利です。
name
#作成するデータベースの名前です。
user_name
#
新しいデータベースを所有するユーザのロール名です。
デフォルト設定(つまり、コマンドを実行したユーザ)を使用する場合はDEFAULT
と指定します。
他のロールによって所有されるデータベースを作成するためには、そのロールに対してSET ROLE
ができなければなりません。
template
#
新しいデータベースの作成元となるテンプレートの名前です。
デフォルトテンプレート(template1
)を使う場合は、DEFAULT
と指定します。
encoding
#
新しいデータベースで使われる文字セット符号化方式です。
文字列定数(例えば'SQL_ASCII'
)、整数の符号化方式番号、DEFAULT
のいずれかを指定します。
DEFAULT
とすると、デフォルトの符号化方式(すなわちテンプレートデータベースの符号化方式)を使います。
PostgreSQLサーバでサポートされる文字セットについては24.3.1で説明します。
この他の制限については後述します。
strategy
#
新規データベースの作成に用いられる手法。
WAL_LOG
手法が用いられる場合、データベースはブロックごとにコピーされ、各ブロックは個別に先行書き込みログに書き込まれます。
これはテンプレートデータベースが小さい場合に最も効率的な手法であるため、デフォルトです。
古いFILE_COPY
手法も利用可能です。
この手法は、ターゲットデータベースが使用する各テーブル空間のための小さなレコードを先行書き込みログに書き込みます。
各レコードは、ファイルシステムレベルでディレクトリ全体を新しい場所にコピーすることを表します。
これにより先行書き込みログの量が大幅に減少しますが、特にテンプレートデータベースが大きい場合は、新規データベースの作成前後にチェックポイントを実行するようにシステムに強制もします。
状況によっては、これはシステム全体のパフォーマンスに顕著な悪影響があるかもしれません。
locale
#
新しいデータベースのデフォルト照合順序および文字分類を設定します。
照合順序は、たとえば、ORDER BY
を使用した問い合わせ内の文字列に適用されるソート順に影響を与えます。また、テキスト列のインデックスで使用される順序にも影響を与えます。
文字分類は、文字の分類、たとえば、小文字、大文字および数字に影響を与えます。
また、オペレーティングシステム環境の関連する側面、LC_COLLATE
およびLC_CTYPE
も設定します。
デフォルトはテンプレートデータベースと同じ設定です。
詳細は、24.2.2.3.1および24.2.2.3.2を参照してください。
lc_collate
、lc_ctype
、またはicu_locale
を個別に設定することで上書きできます。
その他のロケール設定lc_messages、lc_monetary、lc_numeric、lc_timeはデータベース毎には固定されず、このコマンドでは設定されません。
特定のデータベースのデフォルトにしたい場合には、ALTER DATABASE ... SET
が使えます。
lc_collate
#
データベースサーバのオペレーティングシステム環境でLC_COLLATE
を設定します。
デフォルトは、指定されている場合はlocale
の設定、それ以外の場合はテンプレートデータベースと同じ設定です。
追加の制限については、次を参照してください。
locale_provider
がlibc
の場合、新しいデータベースで使用するデフォルト照合順序も設定され、locale
の設定が上書きされます。
lc_ctype
#
データベースサーバのオペレーティングシステム環境でLC_CTYPE
を設定します。
デフォルトは、指定されている場合はlocale
の設定で、それ以外の場合はテンプレートデータベースと同じ設定です。
追加の制限については、次を参照してください。
locale_provider
がlibc
の場合は、新しいデータベースで使用するデフォルトの文字分類も設定し、locale
の設定を上書きします。
icu_locale
#
データベースのデフォルトの照合順序と文字分類に対するICUロケール(24.2.2.3.2 を参照)を指定します。 locale
の設定をオーバーライドします。
ロケールプロバイダはICUでなければなりません。
デフォルトは、指定されている場合はlocale
の設定、それ以外の場合はテンプレートデータベースと同じ設定です。
icu_rules
#このデータベースのデフォルトの照合の動作をカスタマイズするための追加の照合規則を指定します。 これはICUのみでサポートされています。 詳細は24.2.3.4を参照してください。
locale_provider
#
このデータベースのデフォルトの照合順序に使用するプロバイダを指定します。
使用可能な値は、(サーバがICUをサポートするよう構築されている場合には)icu
またはlibc
です。
libc
がデフォルトです。
デフォルトでは、プロバイダはtemplate
のプロバイダと同じです。
詳細は24.1.4を参照してください。
collation_version
#
データベースに保存する照合順序のバージョン文字列を指定します。
通常、これは省略すべきで、その場合、オペレーティングシステムが提供するデータベースの照合順序の実際のバージョンからバージョンが計算されます。
このオプションは、pg_upgrade
が既存のインストールからバージョンをコピーするのに使用することを意図しています。
データベースの照合順序のバージョンの不一致を処理する方法については、ALTER DATABASEも参照してください。
tablespace_name
#
新しいデータベースに関連付けされるデフォルトのテーブル空間名です。
テンプレートデータベースのテーブル空間を使用する場合は、DEFAULT
と指定します。
このテーブル空間が、このデータベースで作成されるオブジェクトのデフォルトのテーブル空間となります。
詳細はCREATE TABLESPACEを参照してください。
allowconn
#
falseの場合、誰もこのデータベースに接続できません。
デフォルトはtrueで、接続が可能です(GRANT
/REVOKE CONNECT
など他の仕掛けで制限されている場合を除きます)。
connlimit
#このデータベースで確立できる同時接続数です。 -1(デフォルト)は無制限を意味します。
istemplate
#
trueの場合、CREATEDB
権限があれば、どのユーザでもこのデータベースを複製できます。
false(デフォルト)の場合、スーパーユーザまたはデータベースの所有者だけが複製できます。
oid
#新しいデータベースに使用されるオブジェクト識別子です。 このパラメータが指定されない場合、PostgreSQLは適切なOIDを自動的に選択します。 このパラメータは主にpg_upgradeが内部的に使用することを意図しており、pg_upgradeのみが16384より小さい値を指定できます。
オプションのパラメータは、任意の順番で記述できます。上記の順番で記述しなくても構いません。
CREATE DATABASE
はトランザクションブロックの内側では実行できません。
ほとんどの場合、「could not initialize database directory」という行が含まれるエラーは、データディレクトリの権限不足、ディスク容量不足などファイルシステムについての問題に関連するものです。
データベースを削除するにはDROP DATABASE
を使用してください。
createdbプログラムは利便性のために提供される、このコマンドのラッパープログラムです。
データベースレベルの設定パラメータ(ALTER DATABASE
によって設定されるもの)とデータベースレベルの権限(GRANT
によって設定されるもの)はテンプレートデータベースからコピーされません。
template1
以外のデータベースの名前をテンプレートに指定してデータベースをコピーすることは可能ですが、これは(まだ)一般的に使用する「COPY DATABASE
」機能として意図されているわけではありません。
主な制限は、コピー中に他のセッションからテンプレートデータベースへの接続ができないことです。
CREATE DATABASE
は、開始した時に他の接続があると失敗します。
テンプレートデータベースへの新規接続はCREATE DATABASE
が完了するまでできません。
詳細は23.3を参照してください。
新しいデータベース用に指定される文字セット符号化方式は選択されたロケール設定(LC_COLLATE
およびLC_CTYPE
)と互換性がなければなりません。
ロケールがC
(や同等のPOSIX
)であれば、すべての符号化方式が許されますが、他のロケール設定では適切に動作する符号化方式は1つしかありません。
(しかしWindowsではUTF-8符号化方式をすべてのロケールで使用できます。)
CREATE DATABASE
では、ロケール設定に関係なくスーパーユーザがSQL_ASCII
符号化方式を指定することを許していますが、こうした選択は廃止予定であり、データベース内にロケールと互換性がない符号化方式でデータが格納された場合、文字列関数の誤動作を多く引き起こします。
符号化方式とロケール設定はテンプレートデータベースのこれらの設定と一致しなければなりません。
ただしtemplate0
がテンプレートとして使用される場合は例外です。
他のデータベースには指定された符号化方式と一致しないデータを含む可能性やLC_COLLATE
およびLC_CTYPE
がソート順序に影響するようなインデックスを含む可能性があることがこの理由です。
こうしたデータをコピーしたものは、新しい設定から見ると破損したデータベースとなります。
しかしtemplate0
には影響を受けるデータやインデックスが含まれていないことが分かっています。
現時点では、非決定論的な比較でデータベースのロケールを使用するオプションはありません(CREATE COLLATION
を参照してください)。
これが必要な場合は、列単位の照合順序を使用する必要があります。
CONNECTION LIMIT
は厳密な制限ではありません。
データベース向けの接続「スロット」が1つ残っていた時に同時に2つの新しいセッション開始要求があった場合、両方とも失敗する可能性があります。
また、この制限はスーパーユーザおよびバックグラウンドのワーカープロセスには強制されません。
新しいデータベースを作成します。
CREATE DATABASE lusiadas;
ユーザsalesapp
を所有者、salesspace
をデフォルトのテーブル空間としてデータベースsales
を作成します。
CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace;
別のロケールでデータベースmusic
を作成します。
CREATE DATABASE music LOCALE 'sv_SE.utf8' TEMPLATE template0;
この例において、指定するロケールがtemplate1
のロケールと異なる場合、TEMPLATE template0
の句が必須となります。
(それらが同じ場合、ロケールを明示的に指定することは必要ありません。)
別のロケールおよび別の文字セット符号化方式でデータベースmusic2
を作成します。
CREATE DATABASE music2 LOCALE 'sv_SE.iso885915' ENCODING LATIN9 TEMPLATE template0;
指定するロケールと符号化方式の設定は対応するものでなければならず、そうでなければエラーが報告されます。
ロケール名はOSに固有のものであるため、上記のコマンドはすべての環境で同じように動作するとは限らないことに注意してください。
標準SQLにはCREATE DATABASE
文はありません。
データベースはカタログに相当するもので、その作成は実装依存です。