laravel部署时php artisan migrate报错主因是数据库连接、权限、状态或缓存问题。需检查db_database是否存在、db_host配置是否正确、.env是否生效、migrations表状态是否一致、外键定义是否合规,以及迁移字段长度是否足够。

部署 Laravel 应用时执行 php artisan migrate 报错,常见于生产环境首次上线或配置变更后,错误往往不是迁移文件本身写错了,而是数据库连接、权限、状态或缓存未同步导致迁移命令根本没走到 SQL 执行阶段。
确认数据库是否存在且可访问
运行 mysql -u root -p 登录 MySQL 控制台,输入密码后立即执行 SHOW DATABASES;,检查 DB_DATABASE 值是否真实出现在列表中。
若不存在,必须手动创建:CREATE DATABASE 【`your_db_name`】 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;——注意反引号不可省略,尤其当库名含短横线(如 my-app)时,不加反引号会导致语法错误。
DB_HOST 不填 localhost:Docker 环境下必须填服务名(如 mysql),WSL 中 localhost 指向 Windows 主机,极易连错实例。
验证 .env 配置是否真正生效
修改 .env 后必须清除 Laravel 配置缓存,否则 php artisan migrate 读的仍是旧值。
执行 php artisan config:clear;再运行 php artisan tinker,输入 config('database.connections.mysql.database') 查看返回值是否为你期望的库名。
如果返回值仍是旧库名,说明缓存未清干净,或 .env 文件权限被系统拒绝读取——检查文件是否被 IDE 临时备份成 .env.bak,Laravel 默认只读 .env。
检查 migrations 表状态是否一致
第一步:运行 php artisan migrate:status,观察最新迁移记录的 batch 值。
第二步:若所有 batch 均为 0,说明这些迁移从未被正式登记——可能是之前连错库执行过、或手动删过 migrations 表但没重跑。
第三步:登录数据库,执行 SELECT * FROM migrations ORDER BY id DESC LIMIT 3;,核对 migration 字段值是否与 database/migrations/ 下文件名完全匹配(大小写、下划线、时间戳一个都不能错)。
类名必须严格对应:文件名为 2024_08_27_153000_add_slug_to_posts.php,类名就必须是 AddSlugToPosts,Linux/macOS 下 Addslugtoposts 会被直接跳过,不报错也不执行。
修复外键约束失败(errno: 150)
方法一:分离自引用外键定义
不要在 Schema::create() 闭包里定义 parent_id → section_comments 的自引用,表还没建完就引用自己,MySQL 直接拒绝。
改为两步:先 Schema::create() 建表(不含 parent_id 外键),再追加 Schema::table('section_comments', function (Blueprint $table) { $table->foreignId('parent_id')->nullable()->constrained(); });
方法二:显式指定关联表与列
避免 constrained() 隐式推断出错,直接写 $table->foreignId('parent_id')->nullable()->references('id')->on('section_comments');——on() 参数必须是真实存在的表名,拼写差一个字母就触发 errno: 150。
【务必确保 petition_id 和 parent_id 的数据类型完全一致】:都用 foreignId(),或都用 unsignedBigInteger(),混用 integer 和 bigInteger 必报错。
处理 “String data, right truncated”(SQLSTATE[22001])
该错误本质是 migrations 表的 migration 字段长度不足,而非你定义的业务字段问题。
在 app/Providers/AppServiceProvider.php 的 boot() 方法中加入 Schema::defaultStringLength(191);,这是唯一安全解法。
然后彻底重置迁移状态:删除 migrations 表 + 删除所有已建业务表 + 运行 php artisan migrate:fresh —— 不要试图 patch 已损坏的 migrations 表,它由框架自动初始化,无法用常规迁移修改。











