Laravel8执行migrate报providers表已存在错误如何解决
报错原因
migrate:fresh的执行逻辑是先删除数据库内所有表,再逐个执行所有已加载的迁移文件。你执行命令时Spatie权限包的迁移文件没有发布到项目迁移目录,因此权限相关表被删除后不会被自动重建;同时迁移执行过程中发生中断,providers表已经实际创建完成,但该迁移的执行记录没有写入数据库的migrations追踪表。- 后续你执行
php artisan migrate时,Laravel对比migrations表的记录,判定2022_05_15_135154_create_providers_table迁移未执行,尝试再次创建providers表,就触发了「表已存在」的1050错误。 - 额外细节:你第一次执行的命令
php artisan migrate:fresh -seed参数写法有误,seed参数需要加双横杠写为--seed,参数识别异常也可能是迁移流程中断的诱因之一。
修复步骤
- 第一步:清理异常状态的数据库,本地开发环境直接执行
php artisan db:wipe命令,该命令会清空当前连接数据库下的所有表,避免残留表或迁移记录冲突;如果命令执行失败,也可以通过phpMyAdmin等数据库管理工具手动删除项目对应库下的所有表。 - 第二步:发布Spatie权限包的官方迁移文件,执行以下命令:
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
执行完成后检查database/migrations目录,确认已自动生成权限相关表(permissions、roles、model_has_permissions、model_has_roles、role_has_permissions)的迁移文件。
- 第三步:重新执行全量迁移与数据填充,运行正确格式的命令:
php artisan migrate:fresh --seed
等待命令执行完成,所有业务表、权限相关表都会被正常创建,同时自动执行数据填充逻辑。
提示:如果不想全量清空数据库,也可以手动删除已存在的providers表,同时删除migrations表中对应providers迁移的记录(如果存在),再执行迁移,但全量清库重跑是本地开发场景下最无残留、出错概率最低的方案。
内容的提问来源于stack exchange,提问作者Sebastian Collantes
相关产品推荐
相关产品推荐

