【データベース勉強中】ALTER TABLEでテーブルを触ってみる



# はじめに
前回Dockerに作成したMySQL環境でデータベースを作成やデータ追加など基本的なことを試してみた。
今回はさらに作成したテーブルのカラムを変更・追加などができる**ALTER TABLE**を触ってみる。

# まずは環境構築〜データベース＆テーブル作成まで

## 環境構築
### 作業フォルダを作成して必要なファイルを作成
```
mkdir test_mysql
cd test_mysql
touch docker-compose.yml
```
**docker-compose.ymlの中身はこちら**

https://qiita.com/takegons/items/742b4ee4d17692d90078#docker-composeyml%E3%81%ABdocker%E6%83%85%E5%A0%B1%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B

### dockerを起動する
```
docker-compose up -d
```

## データベースとテーブルを作成

### dockerへ入ってMySQLへログイン
```
docker exec -it mysql_container bash
mysql -u root -p
```

### データベースをつくる
```
create database alter_table;
```

### テーブルをつくる
```

// まずは使うデータベースを選択
mysql> use alter_table;
Database changed

// テーブルをつくる
create table test(id int, name VARCHAR(10));

mysql> desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.03 sec)
```

# ALTER TABLEを触ってみる

### ADD : 「address」カラムを文字列型（20バイト）で追加してみる
```
mysql> alter table test add address varchar(20);
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc test;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | YES  |     | NULL    |       |
| name    | varchar(10) | YES  |     | NULL    |       |
| address | varchar(20) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
```

### DROP : 「address」カラムを削除する
```
mysql> alter table test drop address;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
```

### CHANGE : IDを自動採番（オートインクリメント）にする
オートインクリメントにするカラムはPRIMARY KEY（主キー）を設定する必要がある。
```
// idにPRIMARY KEY（主キー）を設定
mysql> alter table test add primary key(id);
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show fields from test;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.03 sec)

// idにオートインクリメントを追加
mysql> alter table test change id id int auto_increment;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show fields from test;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)


```

### ADD&CHANGE : カラムを追加して名前を変えてみる
```
mysql> alter table test add hoge varchar(3);
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show fields from test;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | YES  |     | NULL    |                |
| hoge  | varchar(3)  | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)


// hoge→fugaに、3バイト→4バイトにする
mysql> alter table test change hoge fuga varchar(4);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show fields from test;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | YES  |     | NULL    |                |
| fuga  | varchar(4)  | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

// hoge追加
mysql> alter table test add hoge varchar(3);
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show fields from test;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | YES  |     | NULL    |                |
| fuga  | varchar(4)  | YES  |     | NULL    |                |
| hoge  | varchar(3)  | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

```

### デフォルト値の設定を追加してみる
```
mysql> alter table test alter fuga set default 'fuga';

mysql> show fields columns from test;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | YES  |     | NULL    |                |
| fuga  | varchar(4)  | YES  |     | fuga    |                |
| hoge  | varchar(3)  | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
```


### カラムにコメントを追加してみる
```
alter table test modify hoge comment 'TEST';

mysql> show full columns from test;
+-------+-------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| Field | Type        | Collation          | Null | Key | Default | Extra          | Privileges                      | Comment |
+-------+-------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| id    | int(11)     | NULL               | NO   | PRI | NULL    | auto_increment | select,insert,update,references |         |
| name  | varchar(10) | utf8mb4_unicode_ci | YES  |     | NULL    |                | select,insert,update,references |         |
| fuga  | varchar(4)  | utf8mb4_unicode_ci | YES  |     | NULL    |                | select,insert,update,references |         |
| hoge  | varchar(3)  | utf8mb4_unicode_ci | YES  |     | NULL    |                | select,insert,update,references | TEST    |
+-------+-------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
4 rows in set (0.00 sec)
```

# 最後に
まだまだALTERでできることはあるので随時追加していこう。