Laravel 5.3 迁移:1215 无法添加外键约束

Posted

技术标签:

【中文标题】Laravel 5.3 迁移:1215 无法添加外键约束【英文标题】:Laravel 5.3 Migration: 1215 Cannot add foreign key constraint 【发布时间】:2020-09-21 06:00:25 【问题描述】:

我正在使用 Laravel 5.3 并且我正在尝试创建 FK,但是当我使用 artisan 迁移我的表时,我收到以下错误:

  [Illuminate\Database\QueryException]
  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `topic_video` add constraint `topic_video_vendor_id_foreign` foreign key (`vendor_id`) references `vendors` (`id`))



  [Doctrine\DBAL\Driver\PDOException]
  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint



  [PDOException]
  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

我在 SOF 上针对不同的 laravel 版本尝试了多种解决方案,但没有一个可以工作。

这是我的 topic_video 表(InnoDB)

这是一个古老而大的项目,因为我没有迁移它,只有新表我们有迁移。所以我创建了一个供应商(MyISAM)

Schema::create('vendors', function (Blueprint $table) 
            $table->increments('id');
            $table->string('name');
            $table->string('channel_url');
            $table->timestamps();
        );

然后我将上述迁移的 FK 添加到 topic_video 表中。

Schema::table('topic_video', function (Blueprint $table) 
            $table->integer('vendor_id')->unsigned()->nullable();
            $table->foreign('vendor_id')->references('id')->on('vendors');
        );

我试过不带 unsigned(),不带 nullable() 但还是不行!任何帮助将不胜感激!

【问题讨论】:

您确定 vendor 的迁移在您的迁移文件夹中的 topic_video 迁移之前进行吗? topic_video 没有迁移,它是在大约 10 年前通过数据库创建的。正如我所提到的,只有我们将来创建的新表才有迁移,今天我创建了供应商文件夹迁移并添加了它,然后尝试为上面的外键创建 topic_video 迁移。 而我添加 fk 的 topic_video 迁移是在供应商表创建迁移之后进行的 【参考方案1】:

试试这个..

public function up()

    Schema::create('topic_video', function (Blueprint $table) 
        $table->integer('vendor_id')->unsigned()
    );
    Schema::table('topic_video', function($table) 
        $table->foreign('vendor_id')->references('id')->on('vendors');
    );

并确保供应商迁移创建在 topic_video 迁移创建之前

【讨论】:

topic_video 表已经有 id $table->increments('id'); 这是主键,它也有数千条记录。 算上你提供了两个表的完整列列表 我上面已经提供了,看上面topic_video表的截图,vendors表也已经提供了迁移。 这个 sol 已经尝试过了,但没有成功,供应商迁移在 topic_video 之前进行【参考方案2】:

我想我找到了问题...

如果您确实想为非主键创建外键,则它必须是对其具有唯一约束的列。

所以你必须在

上添加“唯一”约束
$table->integer('vendor_id')->unsigned()->nullable()->unique();

请看:

https://***.com/a/18435114/10573560

https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms175464(v=sql.105)?redirectedfrom=MSDN

【讨论】:

基本上我将供应商的 id 作为 FK 添加到 topic_video,为什么我必须更改 topic_video 的 PK 中的任何内容? 终于,...我已经更新了我的答案,请检查一下

以上是关于Laravel 5.3 迁移:1215 无法添加外键约束的主要内容,如果未能解决你的问题,请参考以下文章

SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 [Laravel 7.0]

Laravel 迁移:无法添加外键约束

Laravel - 1215 无法添加外部约束

SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 Laravel 5.8

MySQL 1215无法添加外键约束 - Laravel 5

迁移问题:无法在laravel中添加外键约束