laravel和artisan错误无法在迁移时添加外键

时间:2015-01-29 17:45:07

标签: php mysql database laravel-4 artisan

我知道这已经被多次回答了,因为我在写这个问题时看到了很多答案的建议,但是没有一个能给我正确答案。

当我尝试向表中添加新字段并在laravel中使用artisan migrate时出现错误

General error: 1215 Cannot add foreign key constraint (SQL: alter table `pages` add constraint pages_page_status_foreign foreign key (`page_status`) references `page_status` (`status_value`))

但是我不明白为什么在我做同样的事情并且没有错误之前我得到错误,只有我能想到的答案是在同一张桌子上不可能有两个或更多的外键。这是我的迁移功能

class CreateStatusTable extends Migration {

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('page_status', function($table) {
        $table->increments('id');
        $table->string('status_name');
        $table->integer('status_value')->unsigned();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('page_status');
}

}

这是针对状态表的,现在我必须使用此方法向页面表添加新字段。

class AddStatusToPagesTable extends Migration {

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('pages', function($table) {
        $table->integer('page_status')->unsigned();

        $table->foreign('page_status')->references('status_value')->on('page_status');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('pages', function($table) {
        $table->dropForeign('pages_page_status_foreign');
    });
}

}

这就是出现错误的地方,由于某种原因它不允许我将page_status字段上的外键设置为pages表。

我在我的localhost和phpmyadmin上使用xampp安装我可以看到该表设置为innodb,实际上默认情况下所有内容都设置为innodb。并且在我的数据库页面表中查看page_status字段我首先设置索引而不是我能够使用关系。为什么它没有设置为索引我不知道,但我已经将该表id作为索引和作者作为外键。

在此之前,我还在创建页面表时使用了

添加了几个字段
class CreatePagesTable extends Migration {

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('pages', function($table){
        $table->increments('id');
        $table->integer('author')->unsigned();
        $table->foreign('author')->references('id')->on('users');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('pages');
}

}

使用迁移时我没有遇到任何问题,它运行良好,并且作者被设置为外键。

那么为什么我现在不能添加新的外键呢?

2 个答案:

答案 0 :(得分:1)

这可能是因为如果当前记录不符合条件,则无法添加外键。如果page_status是可选的,则将字段设为可为空:

$table->integer('page_status')->unsigned()->nullable();

如果您不想让它可以为空并且稍后要插入有效的外键值,您可以暂时禁用外键检查:

DB::statement('SET FOREIGN_KEY_CHECKS = 0');

Schema::table('pages', function($table) {
    $table->integer('page_status')->unsigned();
    $table->foreign('page_status')->references('status_value')->on('page_status');
});

DB::statement('SET FOREIGN_KEY_CHECKS = 1');

答案 1 :(得分:0)

我发现问题出在哪里,在向表中添加新字段后,您必须在该字段上设置索引,因此在迁移方面还有一步,将字段设置为索引。

我仍然不明白为什么在我第一次迁移时添加" author"它自动将它作为一个索引,但对于这个我通过设置索引另外这样工作:

    Schema::table('pages', function($table) {
        $table->integer('status')->unsigned()->nullable();
        $table->index('status');

        $table->foreign('status')->references('status_value')->on('page_status');
    });