CREATE DATABASE — 新しいデータベースを作成する
CREATE DATABASEname
[ [ WITH ] [ OWNER [=]user_name
] [ TEMPLATE [=]template
] [ ENCODING [=]encoding
] [ LC_COLLATE [=]lc_collate
] [ LC_CTYPE [=]lc_ctype
] [ TABLESPACE [=]tablespace_name
] [ ALLOW_CONNECTIONS [=]allowconn
] [ CONNECTION LIMIT [=]connlimit
] [ IS_TEMPLATE [=]istemplate
] ]
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サーバでサポートされる文字セットについては23.3.1で説明します。
この他の制限については後述します。
lc_collate
新しいデータベースで使用する照合順(LC_COLLATE
)です。
これは、たとえばORDER BYを持つ問い合わせなどにおいて文字列に適用されるソート順やテキスト型の列に対するインデックスで使用される順序に影響します。
lc_ctype
新しいデータベースで使用する文字のクラス(LC_CTYPE
)です。
これは、たとえば小文字、大文字、数字といった文字の分類に影響します。
デフォルトではテンプレートデータベースの文字クラスを使用します。
さらなる制限に関しては後で説明します。
tablespace_name
新しいデータベースに関連付けされるデフォルトのテーブル空間名です。
テンプレートデータベースのテーブル空間を使用する場合は、DEFAULT
と指定します。
このテーブル空間が、このデータベースで作成されるオブジェクトのデフォルトのテーブル空間となります。
詳細はCREATE TABLESPACEを参照してください。
allowconn
falseの場合、誰もこのデータベースに接続できません。
デフォルトはtrueで、接続が可能です(GRANT
/REVOKE CONNECT
など他の仕掛けで制限されている場合を除きます)。
connlimit
このデータベースで確立できる同時接続数です。 -1(デフォルト)は無制限を意味します。
istemplate
trueの場合、CREATEDB
権限があれば、どのユーザでもこのデータベースを複製できます。
false(デフォルト)の場合、スーパーユーザまたはデータベースの所有者だけが複製できます。
オプションのパラメータは、任意の順番で記述できます。上記の順番で記述しなくても構いません。
CREATE DATABASE
はトランザクションブロックの内側では実行できません。
ほとんどの場合、「could not initialize database directory」という行が含まれるエラーは、データディレクトリの権限不足、ディスク容量不足などファイルシステムについての問題に関連するものです。
データベースを削除するにはDROP DATABASEを使用してください。
createdbプログラムは利便性のために提供される、このコマンドのラッパプログラムです。
データベースレベルの設定パラメータ(ALTER DATABASEによって設定されるもの)とデータベースレベルの権限(GRANTによって設定されるもの)はテンプレートデータベースからコピーされません。
template1
以外のデータベースの名前をテンプレートに指定してデータベースをコピーすることは可能ですが、これは(まだ)一般的に使用する「COPY DATABASE
」機能として意図されているわけではありません。
主な制限は、コピー中に他のセッションからテンプレートデータベースへの接続ができないことです。
CREATE DATABASE
は、開始した時に他の接続があると失敗します。
テンプレートデータベースへの新規接続はCREATE DATABASE
が完了するまでできません。
詳細は22.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;
別のロケールでデータベースmusic
を作成します。
CREATE DATABASE music LC_COLLATE 'sv_SE.utf8' LC_CTYPE 'sv_SE.utf8' TEMPLATE template0;
この例において、指定するロケールがtemplate1
のロケールと異なる場合、TEMPLATE template0
の句が必須となります。
(それらが同じ場合、ロケールを明示的に指定することは必要ありません。)
別のロケールおよび別の文字セット符号化方式でデータベースmusic2
を作成します。
CREATE DATABASE music2 LC_COLLATE 'sv_SE.iso885915' LC_CTYPE 'sv_SE.iso885915' ENCODING LATIN9 TEMPLATE template0;
指定するロケールと符号化方式の設定は対応するものでなければならず、そうでなければエラーが報告されます。
ロケール名はOSに固有のものであるため、上記のコマンドはすべての環境で同じように動作するとは限らないことに注意してください。
標準SQLにはCREATE DATABASE
文はありません。
データベースはカタログに相当するもので、その作成は実装依存です。