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
] [ 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
と指定します。
他のロールによって所有されるデータベースを作成するためには、そのロールの直接的または間接的なメンバであるか、スーパーユーザでなければなりません。
template
新しいデータベースの作成元となるテンプレートの名前です。
デフォルトテンプレート(template1
)を使う場合は、DEFAULT
と指定します。
encoding
新しいデータベースで使われる文字セット符号化方式です。
文字列定数(例えば'SQL_ASCII'
)、整数の符号化方式番号、DEFAULT
のいずれかを指定します。
DEFAULT
とすると、デフォルトの符号化方式(すなわちテンプレートデータベースの符号化方式)を使います。
PostgreSQLサーバでサポートされる文字セットについては24.3.1で説明します。
この他の制限については後述します。
strategy
新規データベースの作成に用いられる手法。
WAL_LOG
手法が用いられる場合、データベースはブロックごとにコピーされ、各ブロックは個別に先行書き込みログに書き込まれます。
これはテンプレートデータベースが小さい場合に最も効率的な手法であるため、デフォルトです。
古いFILE_COPY
手法も利用可能です。
この手法は、ターゲットデータベースが使用する各テーブル空間のための小さなレコードを先行書き込みログに書き込みます。
各レコードは、ファイルシステムレベルでディレクトリ全体を新しい場所にコピーすることを表します。
これにより先行書き込みログの量が大幅に減少しますが、特にテンプレートデータベースが大きい場合は、新規データベースの作成前後にチェックポイントを実行するようにシステムに強制もします。
状況によっては、これはシステム全体のパフォーマンスに顕著な悪影響があるかもしれません。
locale
これはLC_COLLATE
とLC_CTYPE
を一度に設定する手っ取り早い方法です。
その他のロケール設定lc_messages、lc_monetary、lc_numeric、lc_timeはデータベース毎には固定されず、このコマンドでは設定されません。
特定のデータベースのデフォルトにしたい場合には、ALTER DATABASE ... SET
が使えます。
lc_collate
新しいデータベースで使用する照合順(LC_COLLATE
)です。
これは、たとえばORDER BYを持つ問い合わせなどにおいて文字列に適用されるソート順やテキスト型の列に対するインデックスで使用される順序に影響します。
lc_ctype
新しいデータベースで使用する文字のクラス(LC_CTYPE
)です。
これは、たとえば小文字、大文字、数字といった文字の分類に影響します。
デフォルトではテンプレートデータベースの文字クラスを使用します。
さらなる制限に関しては後で説明します。
icu_locale
ICUロケールプロバイダを使用する場合は、ICUロケールIDを指定します。
locale_provider
このデータベースのデフォルトの照合順序に使用するプロバイダを指定します。
使用可能な値は、icu
、libc
です。
libc
がデフォルトです。
使用可能な選択肢は、オペレーティングシステムと構築オプションによって異なります。
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
文はありません。
データベースはカタログに相当するもので、その作成は実装依存です。