Laravel报SQLSTATE[HY000] 1364字段id无默认值及migrate报错如何解决
解决方案
你已经完成了基础排查,以下是针对性的排查修复步骤:
确认数据表主键属性配置正确
直接登录MySQL对应库,执行命令查看表结构:DESC 你的业务表名;
确认id字段的Key列为PRI(主键)、Extra列为auto_increment(自增)。如果配置不符,执行修改命令:ALTER TABLE 你的业务表名 MODIFY COLUMN id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY FIRST;检查对应Eloquent模型配置
打开业务表对应的模型文件,确认三个核心配置没有被手动修改:
- 主键字段名正确:
protected $primaryKey = 'id';(如果自定义了主键名,要和数据库字段对应) - 自增属性开启:
public $incrementing = true;(默认值为true,手动改为false会触发该报错) - 主键类型匹配:
protected $keyType = 'int';(使用UUID主键的场景需要改为string同时关闭自增)
- 修复数据库迁移文件
你执行migrate:refresh也报错,大概率是迁移文件中id字段定义错误。打开对应表的迁移文件,确保id字段写法正确:
优先使用Laravel默认的主键写法:
Schema::create('你的业务表名', function (Blueprint $table) { $table->id(); // 其他字段定义 $table->timestamps(); });
如果是手动定义id字段,必须加上主键和自增属性:$table->integer('id')->autoIncrement()->primary();
排查业务代码逻辑
检查新增数据的代码段,确认调用create()、insert()等方法时,没有手动传入空值/NULL的id字段,id为自增主键时不需要手动赋值。确认数据库连接正确
执行php artisan tinker,输入config('database.connections.mysql.database'),确认返回的库名和你修改表结构的库一致,避免出现多环境连错库的问题。
内容的提问来源于stack exchange,提问作者Anthony Rogers
相关产品推荐
相关产品推荐

