Laravel - 1215 无法添加外部约束
Posted
技术标签:
【中文标题】Laravel - 1215 无法添加外部约束【英文标题】:Laravel - 1215 Cannot add foreign constraint 【发布时间】:2021-07-29 09:55:37 【问题描述】:我正在尝试将最多三个表链接在一起,但是当我运行迁移(使用 artisan)时,我不断收到错误:
一般错误:1215 无法添加外键约束(SQL:更改表
stores
添加约束stores_sale_id_foreign
外键(sale_id
)引用bikes
(id
))
这是我的商店迁移文件:
class CreateStoresTable extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
Schema::create('stores', function (Blueprint $table)
$table->increments('id');
$table->string('store_name');
$table->string('city');
$table->string('manager');
$table->integer('sale_id')->unsigned();
$table->timestamps();
);
Schema::table('stores', function ($table)
$table->foreign('sale_id')->references('id')->on('bikes');
);
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
Schema::dropIfExists('stores');
店铺模式:
class Store extends Model
use HasFactory;
protected $table = 'stores';
protected $fillable = ['store_name', 'city', 'manager', 'sale_id'];
编辑: 自行车迁移:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateBikesTable extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
Schema::create('bikes', function (Blueprint $table)
$table->increments('id');
$table->string('make');
$table->string('model');
$table->string('category');
$table->timestamps();
);
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
Schema::dropIfExists('bikes');
【问题讨论】:
能否添加bikes表迁移源码 这可能与我在附件表和商店表中都使用了 sale_id 的事实有关吗? 你试过foreignId方法laravel.com/docs/8.x/migrations#foreign-key-constraints 【参考方案1】:请尝试$table->id()
或$table->bigIncrements('id')
,而不是增量。
因为 id 列将具有正确的类型。
您还需要将外键列设置为$table->unsignedBigInteger('sale_id');
,以便为外约束设置正确的列类型。
而且您必须确保您的自行车迁移在您的商店迁移之前运行。
【讨论】:
【参考方案2】:试试这个,
class CreateStoresTable extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
Schema::create('stores', function (Blueprint $table)
$table->increments('id');
$table->string('store_name');
$table->string('city');
$table->string('manager');
$table->integer('sale_id')->unsigned()->nullable();
$table->timestamps();
$table->foreign('sale_id')->references('id')->on('bikes')->onDelete('cascade')->onUpdate('cascade');
);
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
Schema::dropIfExists('stores');
【讨论】:
不幸的是仍然遇到同样的错误$table->unsignedInteger('sale_id')->nullable();
试试这个【参考方案3】:
使用此代码
class CreateStoresTable extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
Schema::create('stores', function (Blueprint $table)
$table->increments('id');
$table->string('store_name');
$table->string('city');
$table->string('manager');
$table->unsignedInteger('sale_id')->nullable();
$table->foreign('sale_id')->references('id')->on('bikes')->onDelete('cascade');
$table->timestamps();
);
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
Schema::dropIfExists('stores');
注意:确保外键字段类型不应不匹配。
要么将原始迁移从增量()更改为 大增量() 或者在您的外键列中执行 unsignedBigInteger() 而不是 unsignedInteger()。【讨论】:
不幸的是仍然遇到同样的错误 您的bike
表中bikes.id
的类型是什么?
$table->increments('id')。这就是你要找的吗?
是的,就是这样,让我看看。
我在商店迁移中注释掉了 sale_id 的两行,即使我有相同的代码将另一个表链接到自行车表,它似乎也能正常工作。以上是关于Laravel - 1215 无法添加外部约束的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 迁移 - 一般错误:1215 无法添加外键约束
一般错误:1215 无法添加外键约束,Laravel 5 & MySQL
SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 Laravel 5.8
SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 [Laravel 7.0]
Laravel 5.0 [PDOException] SQLSTATE[HY000]:一般错误:1215 无法添加外键约束