【问题标题】: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表是否存在?

标签: mysql laravel foreign-keys laravel-6 laravel-migrations


【解决方案1】:

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

$table->unsignedInteger('doba');

你应该使用

$table->unsignedBigInteger('doba');

【讨论】:

    【解决方案2】:

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

    $table->unsignedBigInteger('doba');
    

    【讨论】:

      猜你喜欢
      • 2020-11-07
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 2014-09-27
      • 2021-09-23
      • 2019-02-09
      • 2016-11-25
      相关资源
      最近更新 更多