SQLSTATE[HY000]:一般错误:1005 无法创建表 Laravel 8

Posted

技术标签:

【中文标题】SQLSTATE[HY000]:一般错误:1005 无法创建表 Laravel 8【英文标题】:SQLSTATE[HY000]: General error: 1005 Can't create table Laravel 8 【发布时间】:2021-03-20 21:35:26 【问题描述】:
Schema::create('menus', function (Blueprint $table) 
    $table->id();
    $table->string('name')->unique();
    $table->string('slug')->unique();
    $table->integer('price');
    $table->text('description');
    $table->timestamps();
);

Schema::create('categories', function (Blueprint $table) 
    $table->increments('id');
    $table->string('name')->unique();
    $table->string('slug')->unique();
    $table->timestamps();
);

Schema::create('category_menu', function (Blueprint $table) 
    $table->increments('id');
    $table->integer('menu_id')->unsigned()->nullable();
    $table->foreign('menu_id')->references('id')
        ->on('menus')->onDelete('cascade');
    $table->integer('category_id')->unsigned()->nullable();
    $table->foreign('category_id')->references('id')
        ->on('categories')->onDelete('cascade');
    $table->timestamps();
);

当我运行php artisan:migrate 时,我收到以下错误。

SQLSTATE[HY000]: 一般错误: 1005 Can't create table `mieaceh`.`category_menu` (errno: 150 "Foreign key constraint is wrongly forms") (SQL: alter table `category_menu` add constraint `category_menu_menu_id_foreign`删除级联时外键(`menu_id`)引用`menus`(`id`)

【问题讨论】:

$table->increments('id');改成$table->id(); 【参考方案1】:

这是由于外键列和被引用列的数据类型最有可能不匹配

当您使用 $table->id() 创建主键时,自动递增 id 列的数据类型为 unsignedBigInteger,因此您必须具有相同数据类型的外键

Schema::create('category_menu', function (Blueprint $table) 
        $table->id();

        $table->unsignedBigInteger('menu_id');
        $table->foreign('menu_id')->references('id')
            ->on('menus')->onDelete('cascade');

        $table->unsignedBigInteger('category_id');
        $table->foreign('category_id')->references('id')
            ->on('categories')->onDelete('cascade');

        $table->timestamps();
);

您不应该将数据透视表中的列设置为可以为外键为空以保持数据完整性。

还要与主键列的数据类型和定义保持一致——使用$table->id() 时,在所有表的所有迁移中保持一致。这样,将外键定义为 $table->unsignedBigInteger() 时,不匹配的可能性就会降低

【讨论】:

我还是遇到同样的错误,errno: 150 "外键约束格式不正确【参考方案2】:

laravel 迁移文件包含一个日期时间段,用于确定首先迁移哪个文件

注意顺序

2021_10_11_101533_create_posts_table.php
2014_10_12_000000_create_users_table.php

当你跑步时

php artisan migrate 

posts 表将首先被迁移,它包含一个外键

user_id

引用用户表上的主键

身份证

但用户表还不存在,要解决此问题,请更改文件名并确保用户表首先像这样迁移

注意顺序

2014_10_10_000000_create_users_table.php
2021_10_11_101533_create_posts_table.php

声明外键的短模式

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

【讨论】:

以上是关于SQLSTATE[HY000]:一般错误:1005 无法创建表 Laravel 8的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.8 错误 SQLSTATE[HY000]: 一般错误: 1005 uuid

工匠迁移结果:SQLSTATE [HY000]:一般错误:LUMEN / LARAVEL 上的 1005

SQLSTATE [HY000]:一般错误:1005 无法创建表`Data`.`company eligibilities`(errno:150“外键约束形成错误”)

SQLSTATE [HY000]:一般错误:1005无法创建表`Projectname`.`users`(errno:150“外键约束格式不正确”)[重复]

SQLSTATE[HY000]: 一般错误: 1005 Can't create table `school`.`posts` (errno: 150 "Foreign key constr

SQLSTATE [HY000]:一般错误:1005 无法创建表 `ic`.`livros`(errno: 150 "外键约束格式不正确") id`))