はじめに
マイグレーションでテーブルを作成していた時に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 NULL
にDEFAULT NULL
を設定することは許されているが、どうやってもNULL
は入らないみたいです。
あとはSQLモードとか関連あるみたいなので、次回調べたいと思います。
参考文献
https://plaza.rakuten.co.jp/hknopage/diary/201003170000/
https://dev.mysql.com/doc/refman/5.6/ja/data-type-defaults.html