Laravel迁移执行提示成功但未修改数据库且无报错问题咨询
排查解决步骤
- 核对迁移执行记录
- 登录目标实例的MySQL,执行查询
select * from migrations where migration like '%ModifyDispensacoesTable%',确认该迁移是否已经被标记为已执行。如果存在对应记录,Laravel会默认跳过该迁移的重复执行,你可以执行php artisan migrate:rollback --step=1 -vvv回滚单条迁移后重新执行,-vvv参数会打印完整执行日志,方便定位隐藏的报错。
- 确认数据库连接与权限
- 确认当前实例
.env配置的数据库连接地址、库名、账号和你预期的目标库完全一致,避免出现连错测试库、旧库的问题。 - 检查数据库账号权限,执行
SHOW GRANTS FOR '你的数据库用户名'@'实例访问IP';,确认账号持有ALTER、REFERENCES权限(创建外键需要REFERENCES权限),权限不足的情况下部分MySQL配置会静默丢弃DDL操作,不会抛出错误。
- 校验表名大小写匹配
- Ubuntu环境下MySQL默认开启表名大小写敏感(
lower_case_table_names=0),你可以执行show variables like 'lower_case_table_names'确认该配置。本地Windows/Mac环境默认大小写不敏感,所以不会暴露问题,如果迁移中用到的dispensacoes、estoques_triagens、estoques_atendimentos表名和实际库中的表名大小写不一致,会导致DDL操作失效。
- 排查外键约束隐性报错
- 在迁移的
up方法开头临时添加DB::statement('SET FOREIGN_KEY_CHECKS=1;');强制开启外键校验,同时开启Laravel debug模式后重新执行迁移。如果关联的estoques_triagens/estoques_atendimentos表不存在、或者关联的id字段类型和你新增的字段类型不匹配,会触发外键约束报错,部分低日志等级的配置会隐藏这类报错信息。
- 检查全局事务/只读配置
- 排查全局服务提供者中是否有修改数据库事务默认行为的代码,比如自动回滚事务、强制开启只读事务的配置。另外确认目标数据库实例没有开启只读模式,只读模式下修改操作会静默失败不抛错。
内容的提问来源于stack exchange,提问作者Igor Morais
相关产品推荐
相关产品推荐

