MySQLでSELECTした結果をINSERTしようとしたらNULLが空白になった

こんなテーブルがありました。PRIMARY KEYにNULLが設定されようとしています。MySQLにおいて、PRIMARY KEYが設定されたカラムは、NULLが不可です。

mysql> CREATE TABLE `case1` (
->   `hoge` VARCHAR(20) DEFAULT NULL,
->   `hoge2` VARCHAR(20) DEFAULT NULL,
->   PRIMARY KEY (`hoge`,`hoge2`)
-> );
Query OK, 0 rows affected (0.01 sec)

通常は下記のようにPRIMARY KEYにNULLを入れようとしても。ぶつかって止まってくれます。

mysql> INSERT INTO case1 (hoge, hoge2) VALUES ("hoge", NULL);
ERROR 1048 (23000): Column 'hoge2' cannot be null

しかし下記のようにしてSELECT結果をINSERTしようとしている場合は

mysql> INSERT INTO case1 (hoge, hoge2) SELECT "hoge2" AS hoge, NULL AS hoge2;
Query OK, 1 row affected, 1 warning (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 1

NULLが空白に変換されて保存されてしまいました。こういう動きをするの初めて知りました。

mysql> SELECT * FROM case1;
+-------+-------+
| hoge  | hoge2 |
+-------+-------+
| hoge2 |       |
+-------+-------+
1 row in set (0.00 sec)

ちなみに今回のはPRIMARY KEYにNULLが設定されているのが問題でSELECTした結果を保存しようとすることが問題ではないです。試しにこのようなテストを実行すると。

CREATE TABLE `case2` (
`hoge` VARCHAR(20) NULL,
`hoge2` VARCHAR(20) NULL,
PRIMARY KEY (`hoge`)
);
INSERT INTO case2 (hoge, hoge2) VALUES ("hoge", NULL);
INSERT INTO case2 (hoge, hoge2) SELECT "hoge2" AS hoge, NULL AS hoge2;
mysql> CREATE TABLE `case2` (
->   `hoge` VARCHAR(20) NULL,
->   `hoge2` VARCHAR(20) NULL,
->   PRIMARY KEY (`hoge`)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO case2 (hoge, hoge2) VALUES ("hoge", NULL);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO case2 (hoge, hoge2) SELECT "hoge2" AS hoge, NULL AS hoge2;
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0
mysql> SELECT * FROM case2;
+-------+-------+
| hoge  | hoge2 |
+-------+-------+
| hoge  | NULL  |
| hoge2 | NULL  |
+-------+-------+
2 rows in set (0.00 sec)

想定通りに保存されました。てっきりSELECT結果をINSERTする時NULLは使えないパラレルワールドに来たのかと思いましたよ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA