PostgreSQLのtemplate0とtemplate1の違いについて †
psql -lコマンドでデータベース一覧を見るとtemplate0とtemplate1があります。
template0とtemplate1は、createdbやcreate databaseをした時のひな形として利用されます。
この資料は、template0とtemplate1の違いなどについて記述します。
関連記事 †
本資料で使用した環境 †
- OS
CentOS6(X86_64)
- PostgreSQL(CentOSのRPMパッケージを使用)
PostgreSQL 8.4.13 on x86_64-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4), 64-bit
initdbによりデータベースクラスタを作成すると作成される †
initdbによりデータベースクラスタを作成すると以下の3つのデータベースが作成されます。
- postgres
- template0
- template1
この3つはPostgreSQLに必要なデータベースなので削除してはいけません。
template0, template1に接続してみる †
psqlコマンドを使用してtemplate0, template1に接続してみます。
- psql -lでデータベースの一覧を表示
-bash-4.1$ psql -l
データベース一覧
名前 | 所有者 | エンコーディング | 照合順序 | Ctype(変換演算子) | アクセス権
-----------+----------+------------------+-------------+-------------------+-----------------------
postgres | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
template0 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres
: postgres=CTc/postgres
template1 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres
: postgres=CTc/postgres
(3 行)
- psqlコマンドでtemplate0に接続してみると接続拒否されます。
-bash-4.1$ psql template0
psql: FATAL: 現在データベース"template0"は接続を受け付けません
-bash-4.1$
- psqlコマンドでtemplate1には接続が可能です。
-bash-4.1$ psql template1
psql (8.4.13)
"help" でヘルプを表示します.
template1=# \q
-bash-4.1$
上記の操作によりtemplate0は接続拒否されtemplate1には接続が可能です。
template1に接続しテーブルを作成し新規にデータベースを作成してみる †
- template1に接続し以下のように操作しt1テーブルを作成しました。
-bash-4.1$ psql template1
psql (8.4.13)
"help" でヘルプを表示します.
template1=# create table t1 (c1 int, c2 int);
CREATE TABLE
template1=# \d
リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+------+----------+----------
public | t1 | テーブル | postgres
(1 行)
- create databaseコマンドでdb1データベースを新規に作成してみると、
template1のひな形が使用されるため、t1テーブルがすでに作成された状態になります。(複製されます。)
(template1をひな形として使用したため)
template1=# create database db1;
CREATE DATABASE
template1=# \c db1
psql (8.4.13)
データベース "db1" に接続しました。.
db1=# \d
リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+------+----------+----------
public | t1 | テーブル | postgres
(1 行)
db1=# \d t1
テーブル "public.t1"
カラム | 型 | 修飾語
--------+---------+--------
c1 | integer |
c2 | integer |
db1=# \q
- 端末からcreatedbコマンドで作成しても同様にtemplate1をひな形にするためt1テーブルが既に存在します。
-bash-4.1$ createdb db2
-bash-4.1$ psql db2
psql (8.4.13)
"help" でヘルプを表示します.
db2=# \d
リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+------+----------+----------
public | t1 | テーブル | postgres
(1 行)
db2=# \q
上記のことより、template1に対してテーブルの作成などをしておくと、create database, createdbしたときに
template1をひな形としてデータベースが新規作成されるため、template1の状態が引き継がれます。(複製されます。)
template0を使ってデータベースを作成する †
上記ではcreate database, createdbによりデータベースを作成するとtemplate1の状態がひな形として使用されることが確認できました。
以下、template0を使用してデータベースを作成してみます。
- createdbコマンドでtemplateを指定してデータベースdb3を作成したときの出力です。
\dによりテーブルを確認するとテーブルが存在していないことが確認できます。
-bash-4.1$ createdb --template template0 db3
-bash-4.1$ psql db3
psql (8.4.13)
"help" でヘルプを表示します.
db3=# \d
リレーションがありません。
db3=# \q
- create databaseでtemplate0を指定してデータベースdb4を作成したときの出力です。
\dによりテーブルを確認するとテーブルが存在していないことが確認できます。
-bash-4.1$ psql db3
psql (8.4.13)
"help" でヘルプを表示します.
db3=# \h create database
コマンド: CREATE DATABASE
説明: 新しいデータベースを作成する
書式:
CREATE DATABASE データベース名
[ [ WITH ] [ OWNER [=] データベースの所有者 ]
[ TEMPLATE [=] テンプレート名 ]
[ ENCODING [=] エンコーディング ]
[ LC_COLLATE [=] 照合順序 ]
[ LC_CTYPE [=] lc_ctype ]
[ TABLESPACE [=] テーブルスペース名 ] ]
[ CONNECTION LIMIT [=] 最大接続数 ] ]
db3=# create database db4 template=template0;
CREATE DATABASE
db3=# \c db4
psql (8.4.13)
データベース "db4" に接続しました。.
db4=# \d
リレーションがありません。
db4=# \q
以上のことにより、template0を指定するとまっさらなデータベースが作成されることが確認できました。