laravel创建迁移文件需用php artisan make:migration命令并规范命名,如create_users_table;必须指定--create或--table参数以生成schema::create()或schema::table()框架,表名须小写复数下划线分隔,字段定义要匹配类型与约束,外键依赖需确保执行顺序及innodb引擎。

直接用 php artisan make:migration 生成迁移文件,再在 up() 方法里写 Schema::create() ——但多数人卡在字段定义、外键约束和运行时机上。
怎么生成带表名的迁移文件
执行命令时必须明确指定表名,Laravel 不会自动推断:
-
php artisan make:migration create_users_table→ 正确,生成create_users_table.php -
php artisan make:migration users→ 错误,文件名不规范,后续php artisan migrate可能找不到或顺序错乱 - 表名必须是复数、小写、下划线分隔(如
password_resets),否则和 Eloquent 模型默认约定冲突
字段定义常见错误和写法差异
很多迁移失败是因为字段类型选错或参数传错:
-
$table->string('name')默认长度 255;要支持长文本得写$table->text('content'),别硬用string加大长度 -
$table->integer('status')在 MySQL 8.0+ 会报错,改用$table->tinyInteger('status')更安全(值域 0–255) -
$table->foreignId('user_id')是 Laravel 8+ 推荐写法,等价于$table->unsignedBigInteger('user_id')+ 外键链式调用,别漏掉->constrained() -
$table->timestamps()自动加created_at和updated_at,但不会设默认值或自动更新,需要额外加$table->useCurrent()->useCurrentOnUpdate()
外键没生效?检查这三点
明明写了 ->foreignId('user_id')->constrained(),但数据库里没外键约束,通常因为:
- 目标表(如
users)还没创建,或迁移顺序不对——确保create_users_table在引用它的迁移之前执行 - MySQL 引擎不是 InnoDB(MyISAM 不支持外键),在迁移里加
$table->engine = 'InnoDB'; - 字段类型不完全匹配:
foreignId()生成的是BIGINT UNSIGNED,对应主键必须也是id类型且无符号,如果手动改过users.id类型(比如改成INT),外键就会静默失效
运行迁移前容易忽略的细节
php artisan migrate 看似简单,但本地开发和上线环境表现常不一致:
- 本地跑过一次的迁移,再改
up()内容不会重新执行——要改结构得写新迁移,或用php artisan migrate:rollback回退后重跑 -
.env里的DB_CONNECTION必须是mysql或pgsql,设成sqlite却连 MySQL 会导致字段类型映射异常(比如json字段直接变TEXT) - 生产环境禁止用
--force直接跑迁移,先用php artisan migrate --pretend看 SQL 是否符合预期
迁移不是“写完就跑”,关键是字段语义、类型精度、外键依赖关系这三块对齐了,才不会在查数据或联表时突然崩。











