MySQL
cakephp3
初心者エンジニア

MySQL初心者は矛盾してそうなNULLの設定が理解できなかった

はじめに

マイグレーションでテーブルを作成していた時にNOT NULL DEFAULT NULLというカラムを作成したら、どういう挙動か気になったので、調査してみました。

環境

  • cakephp 3系
  • MySQL 5.6

サンプルマイグレーションコード

class SampleMigration extends AbstractMigration
{
    public function up()
    {
        $table = $this->table('tmp_sample');
        $table->addColumn('column1', 'string', [
            'default' => null,
            'null' => true,
        ]);
        $table->addColumn('column2', 'string', [
            'default' => null,
            'null' => false,
        ]);
        $table->create();
    }

    public function down()
    {
        $table = $this->table('tmp_sample');
        $table->drop();
    }
}

作成されたテーブル

mysql> SHOW COLUMNS FROM tmp_sample;

+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| column1 | varchar(255) | YES  |     | NULL    |                |
| column2 | varchar(255) | NO   |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+

検証

文字列のデータをINSERT

INSERT INTO tmp_sample VALUES (1, 'DATA1', 'DATA2');

mysql> SELECT * FROM tmp_sample;
+----+---------+---------+
| id | column1 | column2 |
+----+---------+---------+
|  1 | DATA1   | DATA2   |
+----+---------+---------+

うん、ちゃんと入りました。

明示的にNULLをINSERT

INSERT INTO tmp_sample VALUES (2, 'DATA1', NULL);
ERROR 1048 (23000): Column 'column2' cannot be null

エラーになりました。

暗黙的にNULLをINSERT

INSERT INTO tmp_sample (id, column1) VALUES (3, 'DATA1');
ERROR 1364 (HY000): Field 'column2' doesn't have a default value

エラーになりました。
(エラーメッセージが異なる)

まとめ

NOT NULLDEFAULT NULLを設定することは許されているが、どうやってもNULLは入らないみたいです。
あとはSQLモードとか関連あるみたいなので、次回調べたいと思います。

参考文献

https://plaza.rakuten.co.jp/hknopage/diary/201003170000/
https://dev.mysql.com/doc/refman/5.6/ja/data-type-defaults.html