CREATE DATABASE

Name

CREATE DATABASE  --  新しいデータベースの作成

Synopsis

CREATE DATABASE name
    [ WITH [ LOCATION = 'dbpath' ]
           [ TEMPLATE = template ]
           [ ENCODING = encoding ] ]
  

入力

name

作成するデータベースの名前です。

dbpath

新しいデータベースを格納するためのファイルシステムの 代わりの場所で、文字列リテラルとして指定されます。 もしくはデフォルトの場所を使う場合は DEFAULT です。

template

新しいデータベースを作成するテンプレートの名前、もしくは デフォルトテンプレート (template1) を使うための DEFAULT です。

encoding

新しいデータベースで使うためのマルチバイトエンコードメソッド です。文字列リテラル名 (例えば 'SQL_ASCII')、 もしくは整数エンコード番号、もしくはデフォルトエンコーディング を使うには DEFAULT です。

出力

CREATE DATABASE

コマンドが問題無く終了した場合に返されるメッセージです。

ERROR: user 'username' is not allowed to create/drop databases

データベースを作成するには特別な CREATEDB 権限を持っていなければ なりません。 CREATE USER を参照して下さい。

ERROR: createdb: database "name" already exists

これは name で指定されたデータベースが既に存在する場合に 起こります。

ERROR: database path may not contain single quotes

データベースの場所 dbpath は単一引用符を持つことができません。これはデータベースディレクトリ を作成する shell コマンドが安全に実行できるようにするために 要求されます。

ERROR: CREATE DATABASE: may not be called in a transaction block

もし稼働中の明示的なトランザクションブロックが ある場合 CREATE DATABASE は 呼び出せません。まずトランザクションを終らせて下さい。

ERROR: Unable to create database directory 'path'., ERROR: Could not initialize database directory.

これらはデータディレクトリの無効な権限、いっぱいのディスク、 もしくはその他のファイルシステムの問題に関わる可能性が 高いです。データベースサーバを走らせているユーザが その場所への権限を持たなければなりません。

説明

CREATE DATABASE は新しい Postgres データベースを 作成します。作成者は新しいデータベースの所有者になります。

例えば別のディスクにデータベースを格納したりするために、 代わりの場所を指定することができます。パスは initlocation で用意しなければいけません。

もしパス名がスラッシュを含まない場合、環境変数名として解釈され、 サーバプロセスに知らせなければなりません。この方法だとデータベース 管理者はデータベースを作ることが出来る場所を管理することが できます。 (慣習的な選択は例えば 'PGDATA2'です。) もしサーバが ALLOW_ABSOLUTE_DBPATHS でコンパイルされている場合(デフォルトではそうではありません)、 スラッシュで始まることで識別される絶対パス名(例えば、 '/usr/local/pgsql/data')も許されます。

デフォルトでは、新しいデータベースは標準システムデータベース template1 を複製することによって作成されます。 別のテンプレートは TEMPLATE = name と書くことで 指定できます。特に、TEMPLATE = template0 と書くことで、 使用している Postgres のバージョンによって予測される標準オブジェクト のみを持つ純潔なデータベースを作ることができます。これはもし template1 に追加されたローカルインストールオブジェクトのコピーを 避けたいという場合に便利です。

もし使用しているサーバがマルチバイトエンコードサポートでコンパイル されている場合、オプションのエンコードパラメータはデータベース エンコードの選択を可能にします。指定されないと、選択された テンプレートデータベースに使われるエンコードがデフォルトに なります。

オプションのパラメータは上記で示された順番だけでなく、 どのような順番でも書くこともできます。

注釈

CREATE DATABASEPostgres の言語拡張です。

データベースを削除するには DROP DATABASE を使います。

プログラム createdb は便宜上提供される、このコマンドの shell スクリプトラッパーです。

これらは絶対パス名で指定される代わりのデータベースの 場所の使用と関連するセキュリティとデータの完全性の問題で、 デフォルトではバックエンドに認識される環境変数のみが 代わりの場所として指定できます。更に詳しいことは 管理者用ガイドを見て下さい。

template1 以外のデータベースの名前をテンプレートに指定することによって コピーすることは可能ですが、これは(まだ)一般的な目的の COPY DATABASE 機能として意図されているわけではありません。 特に、ソースデータベースが空回り(データ変更トランザクションが 動いていない状態)していることがこのコピー操作の持続には 欠かせませんが、コピーの進行が行なわれている間変更をできない というような保証はできません。したがって、テンプレートとして 使われるデータベースは読み込みのみとして扱うことをお勧めします。

それぞれのデータベースに便利な二つのフラグが pg_database の中にあります。 datistemplatedatallowconn です。datistemplate は、データベースが CREATE DATABASE のテンプレートとして意図されていることを示すために 設定することができます。もしこのフラグが設定されると、 データベースは CREATEDB 権限を持つどのユーザでも複製できます。 これが設定されていないと、スーパーユーザとデータベースの所有者 のみが複写することができます。もし datallowconn が偽の場合、そのデータベースへの新しい接続が許されます (しかし既存のセッションはフラグを偽にするだけでは殺されません)。 template0 データベースは通常このように 変更を防ぐために記されています。

使用方法

新しいデータベースを作成するには下記のようにします。

olly=> create database lusiadas;
   

代わりの場所 ~/private_db に新しい データベースを作るには下記のようにします。

$ mkdir private_db
$ initlocation ~/private_db
Creating Postgres database system directory /home/olly/private_db/base
   
$ psql olly
Welcome to psql, the PostgreSQL interactive terminal.
 
Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

olly=> CREATE DATABASE elsewhere WITH LOCATION = '/home/olly/private_db';
CREATE DATABASE
   

互換性

SQL92

SQL92 には CREATE DATABASE はありません。 データベースは実装で定義されるカタログと同等のものです。