CREATE DATABASE name [ [ WITH ] [ OWNER [=] user_name ] [ TEMPLATE [=] template ] [ ENCODING [=] encoding ] [ LC_COLLATE [=] lc_collate ] [ LC_CTYPE [=] lc_ctype ] [ TABLESPACE [=] tablespace_name ] [ CONNECTION LIMIT [=] connlimit ] ]
CREATE DATABASEは新しいPostgreSQLデータベースを作成します。
データベースを作成するには、スーパーユーザ、もしくはCREATEDBという特別な権限を持つユーザである必要があります。 CREATE USERを参照してください。
デフォルトでは、新しいデータベースは標準システムデータベースtemplate1を複製することによって作成されます。 他のテンプレートを指定するには、TEMPLATE nameと記述します。 特に、TEMPLATE template0と記述することで、そのバージョンのPostgreSQLによって定義済みの標準オブジェクトのみを持つ、新しいデータベースを作ることができます。 これは、template1に独自にインストールして追加したオブジェクトをコピーしたくない場合に便利です。
作成するデータベースの名前です。
新しいデータベースを所有するユーザのロール名です。 デフォルト設定(つまり、コマンドを実行したユーザ)を使用する場合はDEFAULTと指定します。 他のロールによって所有されるデータベースを作成するためには、そのロールの直接的または間接的なメンバであるか、スーパーユーザでなければなりません。
新しいデータベースを作成元となるテンプレートの名前です。 デフォルトテンプレート(template1)を使う場合は、DEFAULTと指定します。
新しいデータベースで使われる文字セット符号化方式です。 文字列定数(例えば'SQL_ASCII')、整数の符号化方式番号、デフォルトの符号化方式(すなわちテンプレートデータベースの符号化方式)を使うDEFAULTのいずれかを指定します。 PostgreSQLサーバでサポートされる文字セットについては項22.3.1で説明します。 この他の制限については後述します。
新しいデータベースで使用する照合順(LC_COLLATE)です。 これは、たとえばORDER BYを持つ問い合わせなどにおいて文字列に適用されるソート順やテキスト型の列に対するインデックスで使用される順序に影響します。
新しいデータベースで使用する文字のクラス(LC_CTYPE)です。 これは、たとえば小文字、大文字、数字といった文字の分類に影響します。 デフォルトではテンプレートデータベースの文字クラスを使用します。 さらなる制限に関しては後で説明します。
新しいデータベースに関連付けされるデフォルトのテーブル空間名です。テンプレートデータベースのテーブル空間を使用する場合は、DEFAULTと指定します。 このテーブル空間が、このデータベースで作成されるオブジェクトのデフォルトのテーブル空間となります。 詳細はCREATE TABLESPACEを参照してください。
このデータベースで確立できる同時接続数です。 -1(デフォルト)は無制限を意味します。
省略可能なパラメータは、任意の順番で記述できます。上記の順番で記述しなくても構いません。
CREATE DATABASEはトランザクションブロックの内側では実行できません。
ほとんどの場合、"could not initialize database directory"という行が含まれるエラーは、データディレクトリの権限不足、ディスク容量不足などファイルシステムについての問題に関連するものです。
データベースを削除するにはDROP DATABASEを使用してください。
createdbプログラムは利便性のために提供される、このコマンドのラッパプログラムです。
template1以外のデータベースの名前をテンプレートに指定してデータベースをコピーすることは可能ですが、これは(まだ)一般的に使用する"COPY DATABASE"機能として意図されているわけではありません。 主な制限は、コピー中に他のセッションからテンプレートデータベースへの接続ができないことです。 CREATE DATABASEは、開始した時に他の接続があると失敗します。 テンプレートデータベースへの新規接続はCREATE DATABASEが完了するまでロックされます。 詳細は項21.3を参照してください。
新しいデータベース用に指定される文字セット符号化方式は選択されたロケール設定(LC_COLLATEおよびLC_CTYPE)と互換性がなければなりません。 ロケールがC(や同等のPOSIX)であれば、すべての符号化方式が許されますが、他のロケール設定では適切に動作する符号化方式は1つしかありません。 (しかしWindowsではUTF-8符号化方式をすべてのロケールで使用することができます。) CREATE DATABASEでは、ロケール設定に関係なくスーパーユーザがSQL_ASCII符号化方式を指定することを許していますが、こうした選択は廃止予定であり、データベース内にロケールと互換性がない符号化方式でデータが格納された場合、文字列関数の誤動作を多く引き起こします。
符号化方式とロケール設定はテンプレートデータベースのこれらの設定と一致しなければなりません。 ただしtemplate0がテンプレートとして使用される場合は例外です。 他のデータベースには指定された符号化方式と一致しないデータを含む可能性やLC_COLLATEおよびLC_CTYPEがソート順序に影響するようなインデックスを含む可能性があることがこの理由です。 こうしたデータをコピーすると、新しい設定から見るとデータベースが破損する結果となります。 しかしtemplate0には影響を受けるデータやインデックスが含まれていないことが分かっています。
CONNECTION LIMITは厳密な制限ではありません。 データベース向けの接続"スロット"が1つ残っていた時に同時に2つの新しいセッション開始要求があった場合、両方とも失敗する可能性があります。 また、この制限はスーパーユーザには強制されません。
新しいデータベースを作成します。
CREATE DATABASE lusiadas;
salesappユーザを所有者、salesspaceをデフォルトのテーブル空間としてsalesデータベースを作成します。
CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace;
ISO-8859-1文字セットをサポートするmusicデータベースを作成します。
CREATE DATABASE music ENCODING 'LATIN1' TEMPLATE template0;
この例におけるTEMPLATE template0句は、template1の符号化方式がISO-8859-1ではない場合にのみ必要です。 符号化方式を変更するには同様にLC_COLLATEとLC_CTYPEを新たに設定する必要があるかもしれないことに注意してください。