Laravel 8.6执行PHP Artisan Migrate报SQLSTATE[42000]错误如何解决
问题根因
该报错是MariaDB严格模式下timestamp类型字段的规则限制导致的:当MariaDB开启严格模式时,所有声明为NOT NULL的字段必须显式指定默认值,否则就会抛出1067无效默认值错误。你代码里的created_date、modified_date都是NOT NULL的timestamp类型,但没有设置默认值,所以触发生成SQL时报错。
可行解决方案
结合你要求所有字段不可为空的业务规则,可选择以下任意一种方案修改迁移文件:
- 方案1:设置默认值为当前时间(最推荐,符合通用业务逻辑)
给两个timestamp字段添加useCurrent()默认值,修改后代码如下:
该方案无需手动赋值时间字段,插入、更新数据时数据库会自动填充对应时间,完全符合创建时间、修改时间的常规使用需求。$table->timestamp('created_date', $precision = 0)->useCurrent(); $table->timestamp('modified_date', $precision = 0)->useCurrent()->useCurrentOnUpdate(); - 方案2:调整字段类型为datetime(无需修改数据库配置)
如果你业务不需要timestamp的自动时区转换特性,可以把字段类型改为datetime,无需设置默认值也不会触发报错:$table->datetime('created_date', $precision = 0); $table->datetime('modified_date', $precision = 0); - 方案3:关闭MariaDB严格模式(仅临时兼容老代码使用,不推荐生产环境)
打开XAMPP中MariaDB的配置文件my.ini,找到sql_mode配置项,删除其中的STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE三个参数,重启MariaDB服务后再执行迁移即可。该方案会降低数据库数据校验严格度,存在脏数据写入风险。
内容的提问来源于stack exchange,提问作者Lucas Futami
相关产品推荐
相关产品推荐

