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)引用bikesid))

这是我的商店迁移文件:

    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

1215一般错误:无法添加外键约束Laravel

SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 Laravel 5.8

SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 [Laravel 7.0]

Laravel 5.0 [PDOException] SQLSTATE[HY000]:一般错误:1215 无法添加外键约束