【Laravel】マイグレーション時の『Cannot add a NOT NULL column with default value NULL』問題を対処する【エラー】
なぜ、このエラーが発生するのか。まず原因から解説する。
原因
要するにこういうこと。
追加しようとしているフィールド(カラム)がNull禁止でデフォルトが無い。しかし、フィールド(カラム)を追加する以上、どうしてもNullになってしまう。この矛盾をどうするかと言うのがこの問題。
この状況が発生する条件は下記。下記を全て満たすと発生する。
- 条件1:既存のテーブルにカラムを追加する
- 条件2:追加するカラムにカラムにdefaultが指定されていない(defaultが無い状態)
- 条件3:追加するカラムにNullが許可されていない(Null禁止の状態)
対策
対策として、マイグレーションファイルとsqliteを全部削除して最初からマイグレーションファイルを作り直すという選択肢もある。
しかし、defaultを指定するか、nullを許可するほうが簡単である。下記に倣ってdefaultを指定しておけば、それでマイグレーションは問題なくできる。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddIpaddress extends Migration
{
public function up()
{
Schema::table('topics', function (Blueprint $table) {
$table->string("title",100)->default("無題のタイトル");
});
}
public function down()
{
Schema::table('topics', function (Blueprint $table) {
//
});
}
}
結論
理屈はNull禁止であるにもかかわらずデフォルトが存在しない矛盾にある。だから、いずれかを指定してあげれば解決する話である。