首页 > 解决方案 > Laravel,迁移,外键约束形成不正确

问题描述

我有两张桌子,即。产品和机构。有一个pid自动递增的主键,一个id在机构和产品中都是长度的varchar主键。32

每个人都product需要参考它,institution因此我正在设置该institutionproducts并希望它是引用id该机构的外键。

但是,我不断收到此错误,我花了整整一晚试图解决这个问题,但没有任何成功。

$ php artisan migrate
Migration table created successfully.

   Illuminate\Database\QueryException  : SQLSTATE[HY000]: General error: 1005 Can't create table `devbase`.`#sql-824_f23` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `institutions` add constraint `institutions_id_foreign` foreign key (`id`) references `institution` (`products`) on delete RESTRICT)

  at [...]\vendor\laravel\framework\src\Illuminate\Database\Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|         }
    668|

  Exception trace:

  1   PDOException::("SQLSTATE[HY000]: General error: 1005 Can't create table `devbase`.`#sql-824_f23` (errno: 150 "Foreign key constraint is incorrectly formed")")
      [...]\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458

  2   PDOStatement::execute()
      [...]\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458

  Please use the argument -v to see more details.

这是机构表的迁移,文件名是2018_06_14_165449_create_institutions_table.php

public function up()
{
    Schema::create('institutions', function (Blueprint $table) {
        $table->increments('pid');
        $table->string('id', 32)->unique();
        $table->string('shortname', 16)->unique();
        $table->text('fullname');
        $table->string('logo', 100);
        $table->timestamps();
    });
}

虽然这是产品表的迁移,但文件名是2018_06_15_031837_create_products_table.php

public function up()
{
    Schema::enableForeignKeyConstraints();
    Schema::create('products', function (Blueprint $table) {
        $table->increments('pid');
        $table->string('id', 32)->unique();
        $table->string('url', 100)->unique();
        $table->string('shortname', 16)->unique();
        $table->string('institution', 32)->index()->nullable();
        $table->timestamps();

        $table->foreign('institution')
            ->references('institutions')
            ->on('id')
            ->onDelete('RESTRICT');
    });
}

标签: phplaravelforeign-keysmigration

解决方案


$table->foreign('institution')
      ->references('id')
      ->on('institutions')
      ->onDelete('RESTRICT');

希望能帮助到你。


推荐阅读