我的迁移如下:
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`)
我哪里错了?我是迁移的新手,所以这些可能是初学者通常会遇到的错误。但我不明白我到底做错了什么。我希望有人可以帮助我。
答案 0 :(得分:1)
迁移将持续到遇到问题为止。因此可能已添加了外键,但由于错误,尚未创建其关联表。如果您尝试回滚,迁移将假定与外键关联的表存在,并且它也将尝试回滚该表。
但是,该表不存在!
嗯,最简单的方法是清空数据库并重新运行迁移。我之前遇到过这个问题,发现一旦发生这样的问题就很难一步一步地回滚。
答案 1 :(得分:0)
我做了什么
Laravel有一个migrations
表。
Truncate
或清空表格,然后删除与迁移相关的所有表格。
如果可能,请在删除表之前先删除对外键的任何约束。
你应该好好再次迁移。
<强>加成强>
注意down()
函数中删除表格的顺序。
删除一些由onDelete()
声明的引用约束的表肯定需要先删除约束。
我认为这会导致您的回滚错误。
了解您的迁移,伙计: - )