Laravel 10执行php artisan migrate失败主因是环境、配置或迁移机制未对齐,常见于数据库连接未通(如.env未生效、DB_HOST在Docker/WSL中误填localhost)、数据库不存在或权限不足、迁移文件命名/路径错误、migrations表状态与物理表不一致、外键字段类型或创建顺序不合规等。

Laravel 10 安装后执行 php artisan migrate 失败,通常不是因为框架装错了,而是环境、配置或迁移机制本身没对齐。问题往往卡在“命令跑起来了,但 SQL 没执行”这一步,下面直击最常踩的几个坑:
数据库连接根本没通.env 文件里 DB_* 配置看着没问题,但实际 Laravel 并没读到:
- 检查
.env是否被 IDE 自动备份成.env.bak(Laravel 只认.env) - 修改后必须运行
php artisan config:clear,否则缓存旧配置 - 运行
php artisan tinker后输入config('database.connections.mysql.host'),确认输出是你填的值,不是127.0.0.1或空字符串 - Docker/WSL 环境中,
DB_HOST=localhost是错的——要填容器服务名(如mysql)或宿主机 IP
数据库不存在或权限不足
Laravel 不会自动建库,它只操作你指定的库:
- 登录 MySQL:
mysql -u root -p,执行SHOW DATABASES;,确认DB_DATABASE的值真实存在 - 若不存在,手动创建:
CREATE DATABASE \my_app` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;`(注意反引号,尤其库名含短横线时) - 确保
DB_USERNAME对该库有CREATE,ALTER,INSERT权限,不只是SELECT
迁移文件没被识别或状态混乱
“Nothing to migrate” 却明明加了新文件?大概率是:
- 文件没放在
database/migrations/目录下 - 文件名格式错误:必须是
YYYY_MM_DD_HHMMSS_create_posts_table.php,不能用短横线、中文、空格 - 类名不匹配:
class CreatePostsTable extends Migration必须和文件名前缀一致 -
migrations表里已有记录,但对应物理表没建(比如之前连错库执行过迁移),此时migrate会跳过——用php artisan migrate:status查 batch 值,再进数据库查SELECT * FROM migrations ORDER BY id DESC LIMIT 3;核对是否匹配
外键或字段定义触发底层限制
Laravel 10 默认启用严格模式,MySQL 报错 errno: 150 或 1215 很可能源于:
- 外键字段类型不一致:主表
id()→BIGINT UNSIGNED,子表user_id必须用unsignedBigInteger(),不能用integer() - 引用表还没创建就加外键:确保
users表迁移时间戳早于posts表 - 字符集不统一:
config/database.php中 MySQL 连接需明确设置'charset' => 'utf8mb4'和'collation' => 'utf8mb4_unicode_ci' - SQLite 用户注意:默认不启用外键,需在
config/database.php中为 SQLite 连接加'foreign_key_constraints' => true
不复杂但容易忽略。


















