Open8

mysql テーブル作成 ~ カラム追加, 削除

syysyy

テーブルを作成する。
最低1カラム必要。

# create table テーブル名 (カラム)
mysql> create table a (a1 int);
Query OK, 0 rows affected (0.02 sec)

mysql> desc a;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| a1    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.01 sec)

syysyy

テーブル削除

mysql> drop table a;
Query OK, 0 rows affected (0.01 sec)

mysql> desc a;
ERROR 1146 (42S02): Table 'hoge.a' doesn't exist
syysyy

主キーを追加する
primary keyをつけるとNull不可能, 主キーになる

mysql> create table a (id int primary key);
Query OK, 0 rows affected (0.01 sec)

mysql> desc a;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

syysyy

insert。
主キーには同じ値を入れられない。主キーにauto_incrementがないので毎回値を指定する必要がある

mysql> insert into a values (1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values (1);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
syysyy

alterで主キーにauto_incrementつける
modify id auto_incrementではだめ。modify id int auto_increment
incrementsではなくincrement
auto_incrementは外すことも可能

mysql> alter table a modify id int auto_increment;
Query OK, 1 row affected (0.03 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> desc a;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
+-------+---------+------+-----+---------+----------------+
1 row in set (0.00 sec)

idを指定しなくても大丈夫になる
mysql> insert into a values ();
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values ();
Query OK, 1 row affected (0.01 sec)

mysql> insert into a values ();
Query OK, 1 row affected (0.00 sec)

mysql> select * from a;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+
4 rows in set (0.00 sec)

auto_incrementはずせる

mysql> alter table a modify id int ;
Query OK, 1 row affected (0.03 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> desc a;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
syysyy

id値を指定しても問題ない。
id値を指定しないと最大値 + 1になるのかな。

mysql> insert into a values (10);
Query OK, 1 row affected (0.01 sec)

mysql> select * from a;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
| 10 |
+----+
5 rows in set (0.00 sec)

mysql> insert into a values ();
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values ();
Query OK, 1 row affected (0.00 sec)

mysql> select * From a;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
| 10 |
| 11 |
| 12 |
+----+
7 rows in set (0.00 sec)
syysyy

alterでカラムを追加する。
デフォルト値を指定しない場合、既存のレコードは、null許容ならnullになる。
null拒否ならtypeのデフォルト値(intなら0)になる。
default値を指定したらその値になる。

mysql> alter table a add column a1 int ;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc a;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
| a1    | int(11) | YES  |     | NULL    |                |
+-------+---------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> select * from a;
+----+------+
| id | a1   |
+----+------+
|  1 | NULL |
|  2 | NULL |
|  3 | NULL |
|  4 | NULL |
|  6 | NULL |
| 10 | NULL |
| 11 | NULL |
| 12 | NULL |
| 13 | NULL |
+----+------+
9 rows in set (0.00 sec)

# not null制約
mysql> alter table a add column a2 int not null;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from a;
+----+------+----+
| id | a1   | a2 |
+----+------+----+
|  1 | NULL |  0 |
|  2 | NULL |  0 |
|  3 | NULL |  0 |
|  4 | NULL |  0 |
|  6 | NULL |  0 |
| 10 | NULL |  0 |
| 11 | NULL |  0 |
| 12 | NULL |  0 |
| 13 | NULL |  0 |
+----+------+----+
9 rows in set (0.00 sec)

# デフォルト値を指定
mysql> alter table a add column a3 int default 2;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from a;
+----+------+----+------+
| id | a1   | a2 | a3   |
+----+------+----+------+
|  1 | NULL |  0 |    2 |
|  2 | NULL |  0 |    2 |
|  3 | NULL |  0 |    2 |
|  4 | NULL |  0 |    2 |
|  6 | NULL |  0 |    2 |
| 10 | NULL |  0 |    2 |
| 11 | NULL |  0 |    2 |
| 12 | NULL |  0 |    2 |
| 13 | NULL |  0 |    2 |
+----+------+----+------+
9 rows in set (0.00 sec)
syysyy

カラム削除

mysql> alter table a drop column a1;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from a;
+----+----+------+
| id | a2 | a3   |
+----+----+------+
|  1 |  0 |    2 |
|  2 |  0 |    2 |
|  3 |  0 |    2 |
|  4 |  0 |    2 |
|  6 |  0 |    2 |
| 10 |  0 |    2 |
| 11 |  0 |    2 |
| 12 |  0 |    2 |
| 13 |  0 |    2 |
+----+----+------+
9 rows in set (0.00 sec)