我是迁移的新手,并试图在一个引用另一个中的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');
});
答案 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');
});