pgAdmin 4 でパーティションテーブルを作成する

# このエントリを読むと分かること

~~もう全部 psql でいいんじゃないかな。~~
PostgreSQL 10 のパーティションテーブルについて pgAdmin 4 を使った作り方の流れが分かる。

パーティションテーブルとはどんなものか、については触れないので
[「町田は神奈川」タグのエントリ](https://qiita.com/tags/%E7%94%BA%E7%94%B0%E3%81%AF%E7%A5%9E%E5%A5%88%E5%B7%9D) などを参考にしてほしい。


# 経緯

「pgAdmin 4 でパーティションテーブルを作ってみよう」と思ったものの、

* [pgAdmin のマニュアルページで「partition」を検索](https://www.pgadmin.org/docs/pgadmin4/2.x/search.html?q=partition&check_keywords=yes&area=default) してもそれっぽいページがヒットしない。
* そもそも [テーブル作成用画面](https://www.pgadmin.org/docs/pgadmin4/2.x/table_dialog.html) の画像が古い。
	* `General` タブ に `Partitioned Table?` 項目がない。
	* `Partition` タブがない。

という状況(2017.12.20現在)。
なので自分で探り探りやった結果をメモすることにした。

経緯がこんな感じなので「その辺の手順はココにあるよ」というのがあれば指摘してもらえると嬉しい。


# 環境

* Windows 7 64bit
* PostgreSQL 10.1
	* https://www.postgresql.jp/download からダウンロードしたインストーラでインストール。
	* インストール時の設定はロケールを(とりあえず) `C` にした。それ以外はデフォルト。
* pgAdmin 4
	* PostgreSQL インストール時に一緒にインストール。


# 作成するテーブルの構成

## 親テーブルと子テーブル

* 親テーブル
	* `player`
* 子テーブル
	* `player1`
	* `player2`
	* `player3`

## カラム定義

| # | カラム名 | 型 |
|:-:|:--|:--|
| 1 | `player_id` | `integer` |
| 2 | `name` | `text` |

パーティションキーには `player_id` を使用する。

## パーティションキー値と子テーブルの対応

| # | パーティションキー値(`player_id`) | 子テーブル |
|:-:|:--|:--|
| 1 | `1` | `player1` |
| 2 | `2` | `player2` |
| 3 | `3` | `player3` |

データの性質を考えると全く意味のないパーティショニングだが、
気にしたいのはデータ構造ではないのでそこは割り切る。


# 準備

1. pgAdmin 4 を起動する。
2. 適当な DB を作成する。作成が面倒なら `postgres` で。
	* 今回は `mydb` を作成した。


# テーブルの作成

テーブル作成用のダイアログでパーティションテーブルに必要な設定をし、
設定を確定したら親テーブルと子テーブルが作成される、というのが主な流れ。

1. 画面左の `Browser` ペインから `Servers` - `PostgreSQL 10` - `Databases` - `mydb` - `Schemas` - `public` - `Tables` を選択する。
2. 右クリックして `Create` - `Table...` を選択する。
	* テーブルダイアログが開く。タイトルバーの表示は `Create - Table` 。
3. テーブルダイアログの各タブで必要事項を入力する(デフォルトでよい項目は省略)。
	* `General` タブ
		* `Name`: `player`
		* `Partitioned Table?`: `Yes`
			* この項目を `No` から `Yes` に変更すると `Please specify at least one key for partitioned table.`(パーティションテーブル用にキーを指定してね) という警告が表示される。  
			`Partition` タブで設定するので放置でよい。
	* `Columns` タブ
		1. `Name`: `player_id`、`Data type`: `integer` を追加する。
			* 親テーブルには主キーを設定できないため、`Primary key?` は無効になっている。
		2. `Name`: `name`、`Data type`: `text` を追加する。
	* `Partition` タブ
		* `Partition Type`: `List`
			* `Range` も選択できる。今回は `List` にする。
		* `Partition Keys`
			1. `Key type`: `Columns`、`Columns`: `player_id` を追加する。
		* `Partions`
			1. `Name`: `player1`、`In`: `1` を追加する。
			2. `Name`: `player2`、`In`: `2` を追加する。
			3. `Name`: `player3`、`In`: `3` を追加する。
4. `SQL` タブを見て「こんな SQL文(※1) が実行されるんだ。へー」と思う。
5. `Save` ボタンをクリックする。
6. `Browser` ペインで `Tables` に `player` が追加されているのを確認する。
	* 子テーブルは `player` - `Partitions` から確認できる。

※1 SQLタブの表示

```sql:パーティションテーブル作成用のSQL文
CREATE TABLE public.player
(
    player_id integer,
    name text
) PARTITION BY LIST (player_id) 
WITH (
    OIDS = FALSE
);

ALTER TABLE public.player
    OWNER to postgres;

CREATE TABLE public.player1 PARTITION OF public.player
    FOR VALUES IN (1);

CREATE TABLE public.player2 PARTITION OF public.player
    FOR VALUES IN (2);

CREATE TABLE public.player3 PARTITION OF public.player
    FOR VALUES IN (3);
```

おわり。


# おまけ：レコードの登録と確認

レコードが期待通りに登録されるか確認する。

## レコードを登録する

1. `Browser` ペインで `Tables` - `player` を選択する。
2. 右クリックして `Scripts` - `INSERT script` を選択する。
	* 右ペインに `INSERT` 文のテンプレートが表示される。
3. `INSERT` 文を編集して実行する。
	* `INSERT INTO public.player(player_id, name) VALUES (1, 'tarou'), (2, 'jirou'), (3, 'saburou');`
	* 実行は稲妻のアイコンで。もしくは `F5` キー。

## 親テーブルを確認する

1. `Browser` ペインで `Tables` - `player` を選択する。
2. 右クリックして `View/Edit Data` - `All Rows` を選択する。
	* 右ペインに登録したレコード 3件が表示されれば OK 。

## 子テーブルを確認する

1. `Browser` ペインで `Tables` - `player` - `Partitions` - `player1` を選択する。
2. 右クリックして `View/Edit Data` - `All Rows` を選択する。
	* 右ペインに `player_id = 1, name = 'tarou'` のレコードが表示されれば OK 。
3. `player2` と `player3` も同様に確認する。