Laravel-4迁移中的访问冲突错误

时间:2013-12-19 05:59:37

标签: php mysql laravel migration laravel-4

我的迁移如下:

create_users_table.php

class CreateUsersTable extends Migration {
    public function up()
    {
        Schema::create('users', function(Blueprint $table) {
            $table->increments('id');
            $table->string('name', 255);
            $table->string('username', 64)->unique();
            $table->string('email', 255)->unique();
            $table->string('password',64);
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::drop('users');
    }

}

create_predictions_table.php

class CreatePredictionsTable extends Migration {
    public function up()
    {
        Schema::create('predictions', function(Blueprint $table) {
            $table->increments('id');
        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
        $table->integer('fixture_id')->unsigned();
        $table->foreign('fixture_id')->references('id')->on('fixtures');
        $table->integer('home_team_score_prediction');
        $table->integer('away_team_score_prediction');
        $table->timestamps();
        });
    }
    public function down()
    {
        Schema::drop('predictions');
    }
}

create_fixtures_table.php

class CreateFixturesTable extends Migration {
    public function up()
    {
        Schema::create('fixtures', function(Blueprint $table) {
            $table->increments('id');
            $table->integer('home_team_id');
            $table->integer('away_team_id');
            $table->dateTime('date');
            $table->string('venue');
            $table->timestamps();
        });
    }
    public function down()
    {
        Schema::drop('fixtures');
    }
}

最初我使用

运行迁移时
 php artisan migrate

我没有添加外键。我跑了

php artisan migrate:refresh

添加外键约束后,给出了以下错误:

SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'predictions' already exists (SQL: create table `predictions` (`id` int unsigned not null auto_increment primary key, `user_id` int unsigned not null, `fixture_id` int
  unsigned not null, `home_team_score_prediction` int not null, `away_team_score_prediction` int not null, `created_ at` timestamp default 0 not null, `updated_at` timestamp default 0 not null) default character set utf8 collate utf8_unicode_ci)

我认为这是因为该表已经存在(虽然刷新应该回滚迁移并再次运行它们)

当我尝试使用

回滚时
php artisan migrate:rollback

我得到了以下内容:

 [Illuminate\Database\QueryException]
  SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constrain t fails (SQL: drop table `users`)

我哪里错了?我是迁移的新手,所以这些可能是初学者通常会遇到的错误。但我不明白我到底做错了什么。我希望有人可以帮助我。

2 个答案:

答案 0 :(得分:1)

迁移将持续到遇到问题为止。因此可能已添加了外键,但由于错误,尚未创建其关联表。如果您尝试回滚,迁移将假定与外键关联的表存在,并且它也将尝试回滚该表。

但是,该表不存在!

嗯,最简单的方法是清空数据库并重新运行迁移。我之前遇到过这个问题,发现一旦发生这样的问题就很难一步一步地回滚。

答案 1 :(得分:0)

我做了什么 Laravel有一个migrations表。 Truncate或清空表格,然后删除与迁移相关的所有表格。 如果可能,请在删除表之前先删除对外键的任何约束。

你应该好好再次迁移。

<强>加成

注意down()函数中删除表格的顺序。

删除一些由onDelete()声明的引用约束的表肯定需要先删除约束。

我认为这会导致您的回滚错误。

了解您的迁移,伙计: - )