11

您好我在使用迁移架构生成器创建表时遇到问题。具有自引用外键的表出现问题。这是产生错误的代码:

        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 table `cb_cate

gory add constraint cb_category_parent_id_foreign foreign key (parent_id ) referencescb_category (id`)在更新级联上删除级联)(绑定:数组())

[PDOException] SQLSTATE[HY000]:一般错误:1005 无法创建表 'eklik2.#sql-7d4_e'(错误号:150)

任何的想法?

4

6 回答 6

12

您必须将其分解为两个 Schema 块,一个创建列,另一个添加 FK。mysql不能同时做这两个。

于 2013-08-25T09:17:57.173 回答
8

我可能为时已晚,但官方文档声称外键,如果是整数,必须是->unsigned();

http://laravel.com/docs/4.2/schema#foreign-keys

注意:创建引用递增整数的外键时,请记住始终使外键列无符号。

此外,如果您(就像我一样)拼写错误,Artisan 也不会失败unsigned(),我花了好几个小时试图弄清楚为什么没有创建密钥。

所以有两件事:1.始终使外键列无符号以防整数递增 2.检查拼写unsigned()

于 2014-11-15T05:53:33.437 回答
7

两个查询工作:

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');
});
于 2019-02-23T22:36:29.787 回答
3

对于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。直接使用类引用(而不是以前的表名字符串)使您的静态代码检查器能够了解未来的类名更改。
列名中的_id- 后缀parent_id也很重要。


愿以下资源满足您对知识的渴望:

于 2020-12-16T15:18:20.210 回答
0
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');
    });

试试这个

于 2016-04-26T12:43:59.677 回答
0

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

于 2020-01-02T08:07:50.840 回答