迁移时为什么会发生此错误" 1215无法添加外键约束"

时间:2017-05-30 22:14:39

标签: mysql laravel migration

在使用laravel migration时尝试创建外键

就像这个例子:

用户表

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->TinyInteger('color_id')->unsigned();
        $table->foreign('color_id')->references('id')->on('colors');
        $table->timestamps();
    });
}

颜色表

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('color');
        $table->timestamps();
    });
}

有时属性不起作用

[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

2 个答案:

答案 0 :(得分:0)

为了使外键约束起作用,除了具有相同的列类型之外,父列也应该是(或形成)主键或者应该有index。阅读文档here

  

InnoDB允许外键引用任何列或组   列。但是,在引用的表中,必须有一个索引   其中引用的列被列为的第一列   同样的顺序。

在你的情况下,它可能没有索引,因此失败了。

答案 1 :(得分:0)

发生此错误是因为[用户表]中的外键(类型)与[颜色表]中的主键(类型)不同

要解决此问题,应更改[colors table]

中的主键

$table->tinyIncrements('id');

使用主键$table->Increments('id');

您应该使用Integer作为外键

    $table-> unsignedInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

使用主键$table->tinyIncrements('id');

您应该使用unsignedTinyInteger作为外键

    $table-> unsignedTinyInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

使用主键$table->smallIncrements('id');

您应该使用unsignedSmallInteger作为外键

    $table-> unsignedSmallInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

使用主键$table->mediumIncrements('id');

您应该使用unsignedMediumInteger作为外键

    $table-> unsignedMediumInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');