Laravel迁移:可空字段设默认值0后仍为null的问题及解决
问题原因
- 你只给字段设置了默认值,但没移除
nullable()约束,字段依然允许存储null值 - 数据库字段的默认值仅对新插入的记录生效,已存在的null数据不会自动替换成默认值
解决方法
得分两步操作,先处理现有数据,再修改字段属性:
更新现有null数据并修改字段约束
修改你的迁移文件,先把表中已有的null值批量改成0,再移除字段的可空约束并保留默认值:use Illuminate\Support\Facades\DB; Schema::table('table', function (Blueprint $table) { // 把现有null值更新为0 DB::table('table')->whereNull('sold_count')->update(['sold_count' => 0]); DB::table('table')->whereNull('view_count')->update(['view_count' => 0]); // 修改字段:取消可空,设置默认值0 $table->integer('sold_count')->default(0)->nullable(false)->change(); $table->integer('view_count')->default(0)->nullable(false)->change(); });注意:Laravel修改字段类型/约束需要依赖
doctrine/dbal包,如果还没安装,先执行这条composer命令:composer require doctrine/dbal效果验证
- 新插入的记录如果不指定这两个字段的值,会自动填充为0
- 原有存null的记录已经被批量更新为0,之后字段不再允许存储null值
内容的提问来源于stack exchange,提问作者BoboBoy
相关产品推荐
相关产品推荐

