4月入社の新入社員たちが、
以前作った現行社内システム(LAMP)90年代~とある中小ICT企業の社内システム 二代目社長 社内システム開発のもっと内実のリプレースや機能追加をしているのですが、
本当にすごい勢いでやってくれているので、
正直慌てて、もちろん真面目に、
【過去色々やり過ぎて、とっ散らかったサグラダ・ファミリア システム(禁句)】を、
最低限、新人の悪い見本にならないよう見直しています。
フレームワーク無しHTMLテーブルをBootstrapで再現する場合など。
DBも、私の過去のいいかげんな所業により、NULLと0と空白がグダグダになってる…
猛省とともに、初心に立ち返りまとめておきます。
##こういうDBテーブルです
> CREATE TABLE `samptable`(id INT PRIMARY KEY, name TEXT, birth INT);
Query OK, 0 rows affected (0.01 sec)
> SHOW COLUMNS FROM `samptable`;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | text | YES | | NULL | |
| birth | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
##通常のINSERT
> INSERT INTO `samptable`VALUES(1111, '例 太朗', 1427814000);
Query OK, 1 row affected (0.00 sec)
> SELECT * FROM `samptable`;
+------+------------+------------+
| id | name | birth |
+------+------------+------------+
| 1111 | 例 太朗 | 1427814000 |
+------+------------+------------+
通常「*(ワイルドカード)」は使ってはダメ。
##int型のカラムに''をINSERTすると、警告を発しながら0になる
> INSERT INTO `samptable`VALUES(2223, '例 次郎', '');
Query OK, 1 row affected, 1 warning (0.00 sec)
> SELECT * FROM `samptable`;
+------+------------+------------+
| id | name | birth |
+------+------------+------------+
| 1111 | 例 太朗 | 1427814000 |
| 2223 | 例 次郎 | 0 |
+------+------------+------------+
##int型のカラムにNULLをINSERTすると、NULLになる
> INSERT INTO `samptable`VALUES(3333, '例 三郎', NULL);
Query OK, 1 row affected (0.00 sec)
> SELECT * FROM `samptable`;
+------+------------+------------+
| id | name | birth |
+------+------------+------------+
| 1111 | 例 太朗 | 1427814000 |
| 2223 | 例 次郎 | 0 |
| 3333 | 例 三郎 | NULL |
+------+------------+------------+
##text型のカラムに''をINSERTすると、空になる
> INSERT INTO `samptable`VALUES(4444, '', NULL);
Query OK, 1 row affected (0.00 sec)
> SELECT * FROM `samptable`;
+------+------------+------------+
| id | name | birth |
+------+------------+------------+
| 1111 | 例 太朗 | 1427814000 |
| 2223 | 例 次郎 | 0 |
| 3333 | 例 三郎 | NULL |
| 4444 | | NULL |
+------+------------+------------+
##text型のカラムにNULLをINSERTすると、NULLになる
> INSERT INTO `samptable`VALUES(5555, NULL, NULL);
Query OK, 1 row affected (0.00 sec)
> SELECT * FROM `samptable`;
+------+------------+------------+
| id | name | birth |
+------+------------+------------+
| 1111 | 例 太朗 | 1427814000 |
| 2223 | 例 次郎 | 0 |
| 3333 | 例 三郎 | NULL |
| 4444 | | NULL |
| 5555 | NULL | NULL |
+------+------------+------------+
##プライマリーキーだけでINSERTすると、他のカラムは勝手にNULLになる
> INSERT INTO `samptable` (`id`)VALUES(6666);
Query OK, 1 row affected (0.00 sec)
> SELECT * FROM `samptable`;
+------+------------+------------+
| id | name | birth |
+------+------------+------------+
| 1111 | 例 太朗 | 1427814000 |
| 2223 | 例 次郎 | 0 |
| 3333 | 例 三郎 | NULL |
| 4444 | | NULL |
| 5555 | NULL | NULL |
| 6666 | NULL | NULL |
+------+------------+------------+
##当たり前だけど、これは怒られてNG
> UPDATE `samptable` SET birth = 'あああ' WHERE `id` = 6666;
Query OK, 0 rows affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 1
##int型のカラムに''をUPDATEすると、警告を発しながら0になる
> UPDATE `samptable` SET birth = '' WHERE `id` = 6666;
Query OK, 1 row affected, 1 warning (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 1
> SELECT * FROM `samptable`;
+------+------------+------------+
| id | name | birth |
+------+------------+------------+
| 1111 | 例 太朗 | 1427814000 |
| 2223 | 例 次郎 | 0 |
| 3333 | 例 三郎 | NULL |
| 4444 | | NULL |
| 5555 | NULL | NULL |
| 6666 | NULL | 0 |
+------+------------+------------+
##text型のカラムに''をUPDATEすると、空になる
> UPDATE `samptable` SET name = '' WHERE `id` = 6666;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
>SELECT * FROM `samptable`;
+------+------------+------------+
| id | name | birth |
+------+------------+------------+
| 1111 | 例 太朗 | 1427814000 |
| 2223 | 例 次郎 | 0 |
| 3333 | 例 三郎 | NULL |
| 4444 | | NULL |
| 5555 | NULL | NULL |
| 6666 | | 0 |
+------+------------+------------+
##text型のカラムにNULLをUPDATEすると、NULLになる
> UPDATE `samptable` SET name = NULL WHERE `id` = 6666;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
SELECT * FROM `samptable`;
+------+------------+------------+
| id | name | birth |
+------+------------+------------+
| 1111 | 例 太朗 | 1427814000 |
| 2223 | 例 次郎 | 0 |
| 3333 | 例 三郎 | NULL |
| 4444 | | NULL |
| 5555 | NULL | NULL |
| 6666 | NULL | NULL |
+------+------------+------------+