Laravel迁移不会添加外键

时间:2014-02-27 18:44:50

标签: php laravel

我是迁移的新手,并试图在一个引用另一个中的id的情况下创建2个带有外键的表但是我一般都无法添加键错误。有什么我想念的吗?

错误:

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

代码:

    Schema::create('app_groups', function($table) {
     $table->increments('id');
     $table->string('app_name');
     $table->unsignedInteger('app_group_id');
     $table->timestamps();
  });

  Schema::create('app_to_bucket', function($table) {
     $table->increments('id');
     $table->unsignedInteger('app_group_id');
     $table->unsignedInteger('bucket_id');
     $table->timestamps();
  });
  Schema::table('app_to_bucket', function($table) {
     $table->foreign('app_group_id')->references('app_group_id')->on('app_groups')->onDelete('cascade');
  });

6 个答案:

答案 0 :(得分:18)

这肯定会奏效。 Eloquent主键是整数,长度为10,无符号。这就是这种关系不起作用的原因。

Schema::create('app_groups', function($table) {
     $table->string('app_name');
     $table->integer('app_group_id')->length(10)->unsigned();
     $table->timestamps();
  });

  Schema::create('app_to_bucket', function($table) {
     $table->integer('app_group_id');
     $table->integer('bucket_id')->length(10)->unsigned();
     $table->timestamps();
  });
  Schema::table('app_to_bucket', function($table) {
     $table->foreign('app_group_id')->references('app_group_id')->on('app_groups')->onDelete('cascade');

答案 1 :(得分:6)

我已经解决了这个问题。

问题在于Laravel自动假定将列递增为主键。所以我需要指定我的app_group_id是主键。

 Schema::create('app_groups', function($table) {
     $table->string('app_name');
     $table->integer('app_group_id');
     $table->primary('app_group_id');
     $table->timestamps();
  });

  Schema::create('app_to_bucket', function($table) {
     $table->integer('app_group_id');
     $table->integer('bucket_id');
      $table->primary('bucket_id');
     $table->timestamps();
  });
  Schema::table('app_to_bucket', function($table) {
     $table->foreign('app_group_id')->references('app_group_id')->on('app_groups')->onDelete('cascade');
  });

答案 2 :(得分:2)

外键和引用键应具有相同的长度和相同的类型。如果你设置那些满足的键,错误将不会弹出:)

答案 3 :(得分:1)

好的,使用Laravel在MySQL数据库中创建/添加外键约束时可能会遇到几个问题。

首先,您应该检查您指定的列和表的名称。

其次,在创建约束时检查数据库引擎。 请参阅文档https://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constraints.html,它应该是 InnoDB

Schema::create('app_groups', function($table) {
     // setting up the storage engine
     $table->engine='InnoDB';
     $table->increments('id');
     $table->integer('group_id')->unsigned();
     $table->string('app_name');
     $table->timestamps();
  });

Schema::create('app_to_bucket', function($table) {
     $table->engine='InnoDB';
     $table->increments('id');
     $table->integer('app_group_id')->unsigned();
     $table->integer('bucket_id')->unsigned();
     $table->timestamps();
     $table->foreign('app_group_id')
           ->references('group_id')
           ->on('app_groups')
           ->onDelete('cascade');
})
;}

第三(可选),将您的约束(外键,索引等)转移到单独迁移

答案 4 :(得分:0)

您必须先创建表,然后创建外键:

Schema::create('app_to_bucket', function($table) {
    $table->increments('id');
    $table->integer('bucket_id')->unsigned();
    $table->integer('app_group_id')->unsigned();
    $table->timestamps();
});

Schema::table('app_to_bucket', function($table) {
    $table->foreign('app_group_id')->references('app_group_id')->on('app_groups')->onDelete('cascade');
});

答案 5 :(得分:0)

试试这个:

Schema::create('app_groups', function($table) {
     $table->increments('id');
     $table->integer('group_id')->unsigned();
     $table->string('app_name');
     $table->timestamps();
  });
 Schema::create('app_to_bucket', function($table) {
     $table->increments('id');
     $table->integer('app_group_id')->unsigned();
     $table->integer('bucket_id')->unsigned();
     $table->timestamps();
     $table->foreign('app_group_id')->references('group_id')->on('app_groups')->onDelete('cascade');
  });