Laravel执行migrate:fresh创建中间表报SQL 1064语法错误如何解决
报错原因
- 核心原因是你创建
movie_actor中间表时,没有预先定义actor_id和movie_id两个字段,直接声明了外键约束。外键约束是依附于已存在的表字段的,缺少字段定义会导致生成的建表SQL括号内无字段内容,直接触发语法错误。 - 额外潜在问题:你把中间表的创建逻辑写在了
CreateActorsTable迁移文件中,若movies表的迁移执行时间晚于当前迁移,后续还会出现关联表不存在的外键报错。
解决方案
1. 补全中间表的字段定义
修改CreateActorsTable迁移中movie_actor表的创建逻辑,先声明两个和主表主键类型一致的字段,再添加外键约束,修改后代码如下:
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateActorsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('actors', function (Blueprint $table) { $table->id('actor_id'); $table->string('first_name',100); $table->string('last_name',100); }); Schema::create('movie_actor', function (Blueprint $table) { // 先补全两个字段定义,类型和对应主表主键保持一致 $table->unsignedBigInteger('actor_id'); $table->unsignedBigInteger('movie_id'); // 再声明外键和主键 $table->foreign('actor_id')->references('actor_id')->on('actors'); $table->foreign('movie_id')->references('movie_id')->on('movies'); $table->primary(['actor_id','movie_id']); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('movie_actor'); Schema::dropIfExists('actors'); } }
注意:
down方法中要先删中间表再删主表,否则会触发外键约束报错,上面的代码已经调整了删除顺序。
2. (推荐)单独创建中间表迁移
你可以单独执行php artisan make:migration create_movie_actor_table生成独立的中间表迁移文件,将中间表的创建逻辑移到该文件中,同时确保该迁移文件的时间戳晚于movies表和actors表的迁移时间戳,避免关联表未创建的问题。
修改完成后重新执行php artisan migrate:fresh即可正常运行。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

