Laravel 5.1外键迁移错误

时间:2016-03-20 14:05:13

标签: php mysql laravel migration laravel-5.1

执行约束迁移时,我遇到了这个奇怪的错误 当我执行此迁移时,我得到了

 [Illuminate\Database\QueryException]
  SQLSTATE[HY000]: General error: 1005 Can't create table 'flowtime_dev.#sql-85bb_52' (errno: 121) (SQL: alter table `questions` add constraint questions_inventory_i
  d_foreign foreign key (`inventory_id`) references `inventories` (`id`) on delete cascade)



  [PDOException]
  SQLSTATE[HY000]: General error: 1005 Can't create table 'flowtime_dev.#sql-85bb_52' (errno: 121)

我已经读过不同表中的数据类型应该匹配(比如int(10)到int(10))并且它们确实如此,这也是我最后一次迁移(所有表都存在并具有之前由其他迁移创建。)

我真的不知道该怎么做了:(。有人可以帮忙吗? 我见过类似的帖子,但到目前为止他们还没有解决这个问题。

迁移如下:

public function up()
    {
        Schema::table('questions', function ($table) {
            $table->integer('inventory_id')->unsigned()->change();
            $table->foreign('inventory_id')
                ->references('id')->on('inventories')
                ->onDelete('cascade');  
        });

        Schema::table('question_response', function ($table) {
            $table->integer('question_id')->unsigned()->change();
            $table->foreign('question_id')
                ->references('id')->on('questions')
                ->onDelete('cascade');
        });

        Schema::table('question_response', function ($table) {
            $table->integer('sample_result_set_id')->unsigned()->change();             
            $table->foreign('sample_result_set_id')
                ->references('id')->on('sample_response_set')
                ->onDelete('cascade');
        });

        Schema::table('inventory_response', function ($table) {
            $table->integer('inventory_id')->unsigned()->change();  
            $table->foreign('inventory_id')
                ->references('id')->on('inventories')
                ->onDelete('cascade');
        });

        Schema::table('inventory_response', function ($table) {
            $table->integer('sample_result_set_id')->unsigned()->change(); 
            $table->foreign('sample_result_set_id')
                ->references('id')->on('sample_response_set')
                ->onDelete('cascade');
        });

    }

2 个答案:

答案 0 :(得分:1)

在迁移开始时关闭外键约束。

SET FOREIGN_KEY_CHECKS=0;

然后,在迁移数据时,将其重新打开。

SET FOREIGN_KEY_CHECKS=1;

如果这不起作用,请尝试添加以下行。

$table->engine = 'InnoDB'

Further, you can rename the constraint since the name may already be used...

$table->foreign('inventory_id', 'fk_questions_inventory_id')->...

答案 1 :(得分:1)

尝试使用两次单独的迁移。

创建第一个迁移,它将创建表和所有列(在此处放置除$table->foreign子句之外的所有内容)。运行migrate命令。如果您已经进行了此迁移,请不要执行第二个,暂时将其从迁移目录中删除。

然后创建第二次迁移,它会将外键添加到已创建的列(此处仅使用$table->foreign子句)。再次运行migrate命令。

当我处于相同的情况时,这对我有所帮助。我希望它也适合你。