我正在尝试在user_details
表中创建一个外键。
我的user_details
表中有2个外键,其中一个是引用Sentinel创建的主用户表中用户ID的user_id
。我还有一个国家/地区表,我希望将country_of_origin
字段设置为countries表中的国家/地区数字代码。但每次执行迁移时我都会收到以下错误
"Foreign key constraint is incorrectly formed"
我的国家/地区表的架构
public function up()
{
Schema::create('countries', function (Blueprint $table) {
$table->collation = 'utf8_general_ci';
$table->charset = 'utf8';
$table->integer('id');
$table->string('name');
$table->string('alpha_2');
$table->string('alpha_3');
$table->timestamps();
$table->engine = 'InnoDB';
});
}
id字段是ISO 3166-1数字国家/地区代码,而不是行的自动增量ID。此外,此表的数据是使用播种器从JSON文件提供的。
我的用户详细信息表格的模式
public function up()
{
Schema::create('user_details', function (Blueprint $table) {
$table->increments('id',true);
$table->integer('user_id')->unsigned();
$table->string('date_of_birth');
$table->integer('country_of_origin')->unsigned();
$table->integer('contact_number');
$table->timestamps();
$table->engine = 'InnoDB';
});
Schema::table('user_details', function($table) {
$table->foreign('user_id')->references('id')->on('users');
$table->foreign('country_of_origin')->references('id')->on('countries');
});
}
在执行user_details迁移之前,首先执行用于创建国家/地区表的迁移。
如果我删除$table->foreign('country_of_origin')->references('id')->on('countries');
我没有收到任何错误。我也试过$table->integer('country_of_origin');
,但我仍然得到同样的错误。
解决方案 问题是因为国家/地区表中的id字段的名称,但实际上,它不是自动增量col,而是基于种子数据具有固定值。
我按如下方式更改了我的架构 国家架构
public function up()
{
Schema::create('countries', function (Blueprint $table) {
$table->collation = 'utf8_general_ci';
$table->charset = 'utf8';
$table->increments('id',true);
$table->integer('num_id')->unique();
$table->string('name');
$table->string('alpha_2');
$table->string('alpha_3');
$table->timestamps();
$table->engine = 'InnoDB';
});
}
为自动增量ID添加了一个额外字段,并将SO 3166-1数字国家/地区代码存储在num_id字段中
用户详细信息表中的,刚刚更改了以下内容
$table->foreign('country_of_origin')->references('num_id')->on('countries');
答案 0 :(得分:1)
id
表中的 countries
必须是主键
答案 1 :(得分:0)
public function up()
{
Schema::create('countries', function (Blueprint $table) {
$table->collation = 'utf8_general_ci';
$table->charset = 'utf8';
$table->integer('countryid')->unique();
$table->string('name');
$table->string('alpha_2');
$table->string('alpha_3');
$table->timestamps();
$table->engine = 'InnoDB';
});
}