簡體   English   中英

Laravel 5.4:SQLSTATE[HY000]:一般錯誤:1005 無法創建表“外鍵約束格式不正確”

[英]Laravel 5.4: SQLSTATE[HY000]: General error: 1005 Can't create table "Foreign key constraint is incorrectly formed"

我正在使用Laravel 5.4並添加了此遷移:

public function up()
    {
        Schema::create('episodes', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('course_id')->unsigned();
            $table->foreign('course_id')->references('id')->on('courses')->onDelete('cascade');
            $table->string('type', 10);
            $table->string('title');
            $table->string('slug');
            $table->text('description');
            $table->text('body');
            $table->string('videoUrl');
            $table->string('tags');
            $table->string('time', 15)->default('00:00:00');
            $table->integer('number');
            $table->integer('viewCount')->default(0);
            $table->integer('commentCount')->default(0);
            $table->integer('downloadCount')->default(0);
            $table->timestamps();
        });
    }

現在,當我運行php artisan migrate時,我收到此錯誤:

SQLSTATE[HY000]:一般錯誤:1005 Can't create table elearning episodes (errno:150“外鍵約束形成錯誤”)(SQL:alter table episodes添加約束episodes_course_id_foreign外鍵( course_id )在刪除級聯時引用coursesid ))

我也試過這個,但仍然得到同樣的錯誤:

$table->unsignedBigInteger('course_id');

那么我怎樣才能正確運行這個遷移呢? 我真的被這個困住了,請幫助我......


用戶遷移:

Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('level')->default('user');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });

課程遷移

Schema::create('courses', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->string('type', 10);
            $table->string('title');
            $table->string('slug');
            $table->text('description');
            $table->text('body');
            $table->string('price',50);
            $table->string('imageUrl');
            $table->string('tags');
            $table->string('time', 15)->default('00:00:00');
            $table->integer('viewCount')->default(0);
            $table->integer('commentCount')->default(0);
            $table->timestamps();
        });

而不是使用:

$table->increments('id');

你應該使用:

$table->id();

(這更容易)。

建立你的對外關系,而不是擁有

$table->integer('course_id')->unsigned();
$table->foreign('course_id')->references('id')->on('courses')->onDelete('cascade');

你可以使用:

$table->foreignId('course_id')->constrained()->cascadeOnDelete();

這將自動創建正確類型的列(無符號大整數),然后通過在課程表上查找 id 列來創建關系。

編輯

由於您使用的是舊版本的 Laravel,因此您不能使用 id() function,因此只需將 course_id 列創建為大 integer:

$table->bigInteger('course_id')->unsigned();

然后像以前一樣建立你們的關系。

一個問題可能是您沒有將 unsignedBigInteger 作為 course_id

 Schema::create('episodes', function (Blueprint $table) {
        $table->increments('id');
        $table->unsignedBigInteger('course_id')->index('course_id');  
        $table->string('type', 10);
        $table->string('title');
        $table->string('slug');
        $table->text('description');
        $table->text('body');
        $table->string('videoUrl');
        $table->string('tags');
        $table->string('time', 15)->default('00:00:00');
        $table->integer('number');
        $table->integer('viewCount')->default(0);
        $table->integer('commentCount')->default(0);
        $table->integer('downloadCount')->default(0);
        $table->timestamps();

        $table->index( [ 'created_at', 'updated_at' ] );

       //Constraint
        $table->foreign('course_id')->references('id')->on('courses')->onDelete('cascade');

   });

或者

第二個問題可能是你沒有讓你的遷移不是 ruing 順序,例如,首先需要運行用戶表,然后是課程,然后是情節

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM