PostgreSQLのテーブル操作

PostgreSQLのテーブル操作についてささっと。

今回は**hogeDB**にcustomerテーブルを作成し、顧客情報を挿入していく。

顧客情報は下記の3人分。

| ID | name | age |
|:-----------:|:------------:|:------------:|
| 0001 | 山田太郎 | 29 |
| 0002 | 中村花子 | - |
| 0003 | 佐藤信之 | 91 |


##テーブルの土台作成

まずは**hogeDB**にcustomerテーブルを作成していく。
`;`でそれまでのプログラムが実行されるため、見やすくカラムごとに行分けするのが鉄則。

上の表をテーブルに落とし込むには、以下のコードでOK。
これを1行づつ説明していく

```sql:terminal
hoge=# CREATE TABLE Customer
hoge-# (id   char(4)   NOT NULL,
hoge(# name  varchar   NOT NULL,
hoge(# age   INTEGER   ,
hoge(# PRIMARY KEY (id));
CREATE TABLE
```

###テーブル作成の宣言（1行目）

まず`CREATE TABLE <Table name>`でテーブル作成の宣言をしている

```sql:sql
CREATE TABLE Customer
```


###カラムの設定（2~4行目）


今回はカラムが**ID**,**name**,**age**の3つなので、以降はそれぞれについて分かりやすく1行ずつ記述している。

書き方としては`<カラム> <型> <制約>,`である。1カラムごとに`,`で区切る。

####[idカラム]

**id**はchar型の4文字で固定し、かつ主キーなので空白を防ぐために制約部分には**NOT NULL**が入っている。


```sql:sql
id   char(4)   NOT NULL,
```

####[nameカラム]

**name**は可変文字長型のvarcharで指定し、空欄は認めてないので**NOT NULL**

```sql:sql
name  varchar  NOT NULL,
```


####[ageカラム]

**age**はINTEGERにし、制約に関しては何も定めていない（空挿入も可）

```sql:sql
age   INTEGER   ,
```

###Primary Keyの設定（5行目）

リレーショナルデータベースの概念が崩壊してしまうのでしっかりプライマリーキーを指定する。
書き方は`PRIMARY KEY (<主キー>)`

```sql:sql
PRIMARY KEY (id)
```

以上でテーブルの土台設定が終わった。






##テーブルの土台確認

作ったばかりの**customer**テーブルが出来ているかをpsqlの`\d`コマンドで確認する

```sql:terminal
hoge=# \d
         List of relations
 Schema |   Name   | Type  |    Owner   
--------+----------+-------+-------------
 public | customer | table | sf213471118
(1 row)
```

##テーブルにレコードを挿入する

レコードを挿入する際には2通りの方法がある

###列名を指定して挿入する場合

空挿入の部分がある場合や順番の入れ替わりに便利である。
**age**欄が未記入であるこのレコードは以下のように記述できる。

```sql:terminal
hoge=# INSERT INTO Customer(id, name)
VALUES('0002','中村花子');
INSERT 0 1
```

対応していれば順番を入れ替えても大丈夫

```sql:terminal
hoge=# INSERT INTO Customer(name, id)
VALUES('加藤里子',`8888`);
```


###列名を省略して挿入する場合

全ての値を挿入したいときに便利である。
こちらの方が楽だが、順番に全て代入していかなければならない。

```sql:terminal
hoge=# INSERT INTO Customer VALUES('0003','佐藤信之',91);
INSERT 0 1
```


##テーブルの中身を確認する

全ての顧客レコードを挿入したので、SQL文を用いて確認する。
`SELECT <column> FROM <table>;`でOK。今回は一覧で見たいので**column**は`*`とする。

```sql:terminal
hoge=# SELECT * FROM Customer;
  id  |   name   | age 
------+----------+-----
 0001 | 山田太郎  | 29
 0002 | 中村花子  |  
 0003 | 佐藤信之  | 91
(3 rows)
```


##テーブルのレコードを更新する


下記のように`INSERT`されたレコードを

| ID | name | age |
|:-----------:|:------------:|:------------:|
| 0002 | 中村花子 | - |

このように変更したい場合は

| ID | name | age |
|:-----------:|:------------:|:------------:|
| 0002 | 坂井花子 | 49 |

以下のように記述する。

```sql:sql
UPDATE <Table name> SET <column> = 'xxxxx' WHERE <Primary Key> ='vvvv';
```


まず `中村花子` >> `坂井花子`にする。


```sql:terminal
hoge=# UPDATE Staff SET name = '坂井花子' WHERE id ='0002';
UPDATE 1
```

これで更新された。同じく`age`を**NULL**から49にしてみる

```sql:terminal
hoge=# UPDATE Staff SET age = 49 WHERE id ='0002';
UPDATE 1
```

この一連の流れでできたテーブルを一応確認する


```sql:terminal
hoge=# SELECT * FROM Customer;
  id  |   name   | age 
------+----------+-----
 0001 | 山田太郎  |  29
 0003 | 佐藤信之  |  91
 0002 | 坂井花子  |  49
```

以上で完成した。


###[注意点]
`UPDATE`を使う際には`WHERE <Primary Key> = 'vvvv'`で指定しないと**カラム内の全てが変更されてしまう。**

試行例：

```sql:terminal
hoge=# UPDATE Staff SET age = 49;
```

試行結果：

```sql:terminal
hoge=# SELECT * FROM Customer;
  id  |   name   | age 
------+----------+-----
 0001 | 山田太郎  |  49
 0003 | 佐藤信之  |  49
 0002 | 坂井花子  |  49
```

全レコードのカラムを全て同じ値にするのには便利そうだが~~使わなさそう~~


##データを削除する

削除には指定したレコードを消すのと、全行を削除する2通りがある。
データ削除には`DELETE`コマンドを使用する。


```sql:sql
DELETE FROM <Table name> WHERE <Primary Key> = 'vvvv';
```


実際に下記のレコードを削除する

| ID | name | age |
|:-----------:|:------------:|:------------:|
| 0003 | 佐藤信之 | 91 |




```sql:terminal
hoge=# DELETE FROM Customer WHERE id='0003';
DELETE 1
hoge=# SELECT * FROM Customer;
  id  |   name   | age 
------+----------+-----
 0001 | 山田太郎 |  29
 0002 | 坂井花子 |  49
(2 rows)
```



しっかり削除されたことが確認できた。


###[注意点]
`UPDATE`と同じく、`DELETE`を使う際には`WHERE <Primary Key> = 'vvvv'`で指定しないと**レコードが全て削除されてしまう（空のテーブルができる）**



##テーブルを削除する

テーブル自体を削除する場合は`DROP TABLE`コマンドを使用する。

```sql:sql
DROP TABLE <Table name>;
```


実際にこの**Customer**テーブルを削除してみる。現段階でテーブルは以下の通り。



```sql:terminal
hoge=# \d
         List of relations
 Schema |   Name   | Type  |    Owner   
--------+----------+-------+-------------
 public | customer | table | sf213471118
(1 row)
```


この状態でテーブルを削除する。

```sql:terminal
hoge=# DROP TABLE Customer;
DROP TABLE
```


`\d`で削除されているか確認してみる


```terminal:terminal
hoge=# \d
Did not find any relations.
```

しっかり削除されていることが確認できた