一尘不染

使用Laravel模式构建和外键“常规错误:1005无法创建表”

mysql

本质上,我和这个家伙有同样的问题,要减去表前缀。因为我没有表前缀,所以他的修复不起作用。http://forums.laravel.com/viewtopic.php?id=972

我正在尝试使用Laravel的Schema Builder来构建表,如下所示:

Schema::create('lessons', function($table)
{
    $table->increments('id');
    $table->string('title')->nullable();
    $table->string('summary')->nullable();
    $table->timestamps();
});

Schema::create('tutorials', function($table)
{
    $table->increments('id');
    $table->integer('author');
    $table->integer('lesson');
    $table->string('title')->nullable();
    $table->string('summary')->nullable();
    $table->string('tagline')->nullable();
    $table->text('content')->nullable();
    $table->text('attachments')->nullable();
    $table->timestamps();
});

Schema::table('tutorials', function($table)
{
    $table->foreign('author')->references('id')->on('users');
    $table->foreign('lesson')->references('id')->on('lessons');
});

问题是,当我运行此代码(在/ setup路由中)时,出现以下错误:

SQLSTATE[HY000]: General error: 1005 Can't create table 'tutorials.#sql-2cff_da' (errno: 150)

SQL: ALTER TABLE `tutorials` ADD CONSTRAINT tutorials_author_foreign FOREIGN KEY (`author`) REFERENCES `users` (`id`)

Bindings: array (
)

基于网络上的帖子以及有关如何 设置 Laravel口才关系的有限文档,我不确定自己做错了什么…

users已经存在,并且 确实
有一个id字段是auto_increment。我还用适当的关系(belongs_tohas_many)设置了模型,但据我所知这不是问题,这是数据库设置。该数据库
InnoDB。

外键到底在做什么错?


阅读 222

收藏
2020-05-17

共1个答案

一尘不染

我不是100%确定这是否是失败的原因,但要指出几个提示。如果您使用旧版本的mySQL作为数据库,则默认表实现是myISAM,它不支持外键约束。由于脚本无法进行外键分配,因此最好在Schema的create方法中使用此语法明确声明希望将INNODB作为引擎。

Schema::create('lessons', function($table)
{
    $table->engine = 'InnoDB';

    $table->increments('id');
    $table->string('title')->nullable();
    $table->string('summary')->nullable();
    $table->timestamps();
});

希望这可以减轻您遇到的问题。

另外,尽管您可以将外键声明为事后的想法,但是我可以在初始模式中创建外键,因为我可以轻松进行检查以确保已设置正确的数据库引擎。

Schema::create('tutorials', function($table)
{
    $table->engine = 'InnoDB';

    $table->increments('id');
    $table->integer('author');
    $table->integer('lesson');
    $table->string('title')->nullable();
    $table->string('summary')->nullable();
    $table->string('tagline')->nullable();
    $table->text('content')->nullable();
    $table->text('attachments')->nullable();
    $table->timestamps();

    $table->foreign('author')->references('id')->on('users');
    $table->foreign('lesson')->references('id')->on('lessons');
});

希望这有助于/解决您的问题。

2020-05-17