LoginSignup
0
0

More than 1 year has passed since last update.

いまさらながらNULLと0と空白(恥)

Last updated at Posted at 2021-09-19

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 |
+------+------------+------------+
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0