Laravel迁移自引用外键常规错误:1005无法创建表格

wlsrxk51  于 2023-01-21  发布在  其他
关注(0)|答案(8)|浏览(106)

为什么我在使用Laravel Migrations Schema Builder创建表时遇到问题?
带有自引用外键的表会出现此问题。

Schema::create('cb_category', function($table)
{
    $table->integer('id')->primary()->unique()->unsigned();
    $table->integer('domain_id')->unsigned();
    $table->foreign('domain_id')->references('id')->on('cb_domain'); 
    $table->integer('parent_id')->nullable(); 
    $table->foreign('parent_id')->references('id')->on('cb_category')->onUpdate('cascade')->onDelete('cascade'); 
    $table->string('name');
    $table->integer('level');
});

SQLSTATE[HY000]: General error: 1005 Can't create table 'eklik2.#sql-7d4_e' (errno: 150) (SQL: alter tablecb_categoryadd constraint cb_category_parent_id_foreign foreign key (parent_id) referencescb_category(id) on delete cascade on update cascade) (Bindings: array ())
[PDOException]
SQLSTATE[HY000]: General error: 1005 Can't create table 'eklik2.#sql-7d4_e' (errno: 150)

z5btuh9x

z5btuh9x1#

你必须把它分成两个Schema块,一个创建列,另一个添加FK。mysql不能同时做这两件事。

kcwpcxri

kcwpcxri2#

两个查询起作用:

Schema::create('cb_category', function($table)
{
    $table->integer('id')->primary()->unique()->unsigned();
    $table->integer('parent_id')->nullable();  
});

Schema::table('cb_category', function (Blueprint $table) 
{
    $table->foreign('parent_id')->references('id')->on('cb_category')->onUpdate('cascade')->onDelete('cascade');
});
zlwx9yxi

zlwx9yxi3#

我可能来不及参加聚会了,但是官方文档声称,如果是整数,则外键必须是->unsigned();
http://laravel.com/docs/4.2/schema#foreign-keys
注意:创建引用递增整数的外键时,请记住始终使外键列无符号。
此外,Artisan不会失败,如果您(正如我所做的)拼错了unsigned(),我已经花了相当多的时间试图找出为什么没有创建密钥。
所以有两件事:1.在整数递增的情况下,始终使外键列无符号2.检查unsigned()的拼写

csbfibhn

csbfibhn4#

也是一个延迟响应,但可能是Laravel 8的一个更习惯的方式:

use App\Models\CbCategory;

...

Schema::create("cb_category", function(Blueprint $table)
{
    $table->id();
    $table->foreignIdFor(CbCategory::class, "parent_id")
        ->constrained()
        ->cascadeOnUpdate()
        ->cascadeOnDelete()
        ->nullable();
});

**请注意:**我猜这里的类名是CbCategory。使用第一手的类引用(而不是以前的表名字符串)使静态代码检查器能够在将来发现类名的更改。

此外,parent_id列名中的_id-后缀也很重要。
愿以下资源满足您的求知欲:

4dbbbstv

4dbbbstv5#

Schema::create('cb_category', function (Blueprint $table) {
        $table->increments('id')->unsigned();
        $table->integer('domain_id')->unsigned();
        $table->foreign('domain_id')->references('id')->on('cb_domain');
        $table->integer('parent_id')->nullable();
        $table->foreign('parent_id')->references('id')->on('cb_category')->onUpdate('cascade')->onDelete('cascade');
        $table->string('name');
        $table->integer('level');
    });

试试这个

yk9xbfzb

yk9xbfzb6#

我认为您有另一个表引用了您要创建的当前表。我遇到了这个问题,删除该表后问题就解决了

yjghlzjz

yjghlzjz7#

Schema::create('categories', function (Blueprint $table) {
        $table->id();
        $table->integer('parent_id')->unsigned();
        $table->foreign('parent_id')->on('categories')->references('id');
    });

在将“$table-〉integer('parent_id')-〉unsigned()”更改为“$table-〉bigInteger('parent_id')”后,我使用此代码时遇到相同的错误;我的问题解决了
这里的要点是确保外键的类型与主键的类型相同。

yeotifhr

yeotifhr8#

从Laravel 8+开始,你不需要分成两个Schema块,你可以使用foreignIdFor(CbCategory::class, 'cb_category_id'),它会创建一个名为cb_category_id的列
前。

Schema::create("cb_category", function(Blueprint $table)
{
    $table->id();
    $table->foreignIdFor(CbCategory::class, 'cb_category_id')->nullable()->constrained()->cascadeOnUpdate()->cascadeOnDelete();
});
    • 任何附加列修饰符(例如nulleable)必须在受约束方法之前调用。**

您可以在foreignIdFor中使用第二个参数作为引用列名(如果它不是"id")不是您希望它具有的名称,在您的情况下,名称将自动为"cb_category_id"

相关问题