Laravel 外键约束格式不正确我已经搜索过,找不到答案

Posted

技术标签:

【中文标题】Laravel 外键约束格式不正确我已经搜索过,找不到答案【英文标题】:Laravel foreign key constraint is incorrectly formed I have searched and cannot find the answer 【发布时间】:2020-04-23 07:12:48 【问题描述】:
class CreateMediaTable extends Migration

    public function up()
    
        Schema::create('media', function (Blueprint $table) 
            $table->increments('id');
            $table->unsignedBigInteger('id_users');
            $table->unsignedBigInteger('id_posts');
            $table->char('type', 1); //P: photo or V: video
            $table->string('file');
            $table->timestamps();

            $table->foreign('id_posts')->references('id')->on('posts');
            $table->foreign('id_users')->references('id')->on('users');
        );
    

    public function down()
    
        Schema::dropIfExists('posts');
    

还有我的 createprofilemigration

/**
 * @author Alex Madsen
 * 
 * @date November 6, 2018
 */ 

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUserProfilesTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('user_profiles', function (Blueprint $table) 
            $table->unsignedInteger('id_users')->unique();
            $table->string('handle')->unique(); 
            $table->string('icon')->default('https://i.redd.it/130am13nj6201.png'); 
            $table->string('profile_image')->nullable(); 
            $table->string('description')->nullable(); 
            $table->timestamps();
        );
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::dropIfExists('user_profiles');
    

不断抛出这些错误,我错过了什么?请注意,我对此很陌生,在我的休息时间尝试使用 youtube 和 *** 学习。不知道该走哪条路。我查看了论坛并尝试了 $table->foreign('id_posts')->references('id')->on('posts');但它并没有解决问题。

Illuminate\Database\QueryException  : SQLSTATE[HY000]: General error: 1005 Can't create table `ci`.`media` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter t
able `media` add constraint `media_id_posts_foreign` foreign key (`id_posts`) references `posts` (`id`))

  at C:\xampp6\htdocs\lol\simple_social_network_laravel\vendor\laravel\framework\src\Illuminate\Database\Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) 
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|          
class CreatePostsTable extends Migration

    public function up()
    
        Schema::create('posts', function (Blueprint $table) 
            $table->increments('id');
            $table->unsignedBigInteger('id_users');
            $table->unsignedInteger('subreddit_id');
            $table->text('description');
            $table->string('title');
            $table->text('content');
            $table->unsignedInteger('id_posts');
            $table->timestamps();

            $table->foreign('id_users')->references('id')->on('users');
            $table->foreign('subreddit_id')->references('id')->on('id_posts');
        );
    

    public function down()
    
        Schema::dropIfExists('posts');
    

【问题讨论】:

您能否将您的posts 迁移代码添加到? 已修复,抱歉第一次发帖。 在您的media 迁移中编辑您的posts_idunsignedInteger 成为这样的$table->unsignedInteger('id_posts'); 【参考方案1】:

使用外键时的类型应该完全相同。

你创造:

$table->unsignedBigInteger('id_posts');

所以它是无符号大整数,但可能在 posts 表中而不是 bigIncrements 中,您只使用 increments 作为 id 列,这就是您收到此错误的原因。

所以很有可能代替:

$table->unsignedBigInteger('id_posts'); 

你应该使用

$table->unsignedInteger('id_posts'); 

或作为替代解决方案使用

$table->bigIncrements('id');

posts迁移中

【讨论】:

@Insomniakinn 是的,所以在回答你有解决方案你应该改变什么 $table->increments('id'); $table->unsignedInteger('id_users'); $table->unsignedInteger('id_posts'); $table->char('type', 1); //P: photo or V: video $table->string('file'); $table->timestamps(); $table->foreign('id_posts')->references('id')->on('posts'); $table->foreign('id_users')->references('id')->on('users'); 它仍然抛出同样的错误。当然,我是编码新手,在休息日学习,所以我确信用户错误。 @Insomniakinn 你确定错误是一样的吗?您应该只在单个文件中进行更改,而不是在两个文件中进行更改,它应该可以工作 我继续将代码上传到 git,不确定是否有大图有帮助。 github.com/Wildindfw/mylaraveltest【参考方案2】:

在您的posts 迁移中,您将idincrements 这意味着它需要

unsigned integer auto_increment

但是在您迁移media 文件时,您使用unsignedBigInteger 创建了一个posts_id

所以有两种方法可以解决这个问题,只能选择一个

    posts 迁移中的id 编辑为bigincrements 在“媒体”迁移中编辑您的posts_idunsignedIntegere

【讨论】:

以上是关于Laravel 外键约束格式不正确我已经搜索过,找不到答案的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 上的“外键约束格式不正确”

Laravel 迁移错误号:150“外键约束格式不正确”

LARAVEL 5.5 外键约束的格式不正确'

laravel errno 150 外键约束格式不正确

Laravel 迁移:Errcode:150“外键约束格式不正确”

Laravel 抛出 errno:150 “外键约束的格式不正确”,尽管语法正确