运行迁移时如何修复外键错误

Posted

技术标签:

【中文标题】运行迁移时如何修复外键错误【英文标题】:How to fix foreign key error when running migration 【发布时间】:2020-04-20 15:38:57 【问题描述】:

我不知道为什么它仍然不起作用并显示这个:

Illuminate\Database\QueryException : SQLSTATE[HY000]: 一般 错误:1005 无法创建表db_rocnikovka.books(错误号:150 “外键约束的格式不正确”)(SQL:alter table books添加约束books_doba_foreign外键(doba) 参考druh_knihies (id_druhu))

在 C:\xampp\htdocs\Rocnikovka\vendor\laravel\framework\src\Illuminate\Database\Connection.php:665

异常跟踪: 1 PDOException::("SQLSTATE[HY000]: 一般错误: 1005 无法创建 > 表db_rocnikovka.books (errno: 150 "外键约束格式不正确")") C:\xampp\htdocs\Rocnikovka\vendor\laravel\framework\src\Illuminate\Database\Connection.php:459

2 PDOStatement::execute()

  C:\xampp\htdocs\Rocnikovka\vendor\laravel\framework\src\Illuminate\Database\Connection.php:459
 catch (Exception $e) 
    throw new QueryException(
       $query, $this->prepareBindings($bindings), $e
    );
 

第一张桌子

class CreateDruhKnihiesTable extends Migration

    public function up()
    
        Schema::create('druh_knihies', function (Blueprint $table) 
            $table->bigIncrements('id_druhu');
            $table->string('nazev');
            $table->timestamps();
        );
    

    public function down()
    
        Schema::dropIfExists('druh_knihies');
    

第二张表

class CreateBooksTable extends Migration

    public function up()
    
        Schema::create('books', function (Blueprint $table) 
            $table->bigIncrements('id_book');
            $table->string('nazev');
            $table->string('autor');
            $table->string('druh');
            $table->unsignedInteger('doba');
            $table->foreign('doba')->references('id_druhu')->on('druh_knihies');
            $table->integer('pocet_stranek');
            $table->timestamps();
        );
    

    public function down()
    
        Schema::dropIfExists('books');
    

【问题讨论】:

创建books表时druh_knihies表是否存在? 【参考方案1】:

这里的问题是druh_knihies 中的id_druhu 被定义为bigIncrements 并且您将doba 创建为unsignedInteger 并且使用外键类型时应该完全相同。所以在这种情况下,而不是

$table->unsignedInteger('doba');

你应该使用

$table->unsignedBigInteger('doba');

【讨论】:

【参考方案2】:

您的外键需要与它引用的键具有相同的类型。所以第二个表外键doba需要改成这个,因为你在第一个表主键中使用BigIncrements()

$table->unsignedBigInteger('doba');

【讨论】:

以上是关于运行迁移时如何修复外键错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 5.1 迁移中使用外键

迁移错误后处于带有外键的奇怪状态

使用 Doctrine/DBAL 迁移数据库时如何修复未知数据库错误?

LARAVEL 8:一般错误:使用外键运行迁移时发生 1005

MySQL数据库的Laravel迁移“无法添加外键约束”错误

Laravel 迁移错误号:150“外键约束格式不正确”