迁移错误后外键处于奇怪状态
In weird state with foreign key after migrations bug
我正在使用 laravel 5 进行我的第一个项目。我所有的迁移脚本都会创建 tables,除了之后添加外键约束的脚本(因此两个 tables 在 运行s 之前就位)。我在我的一个迁移脚本中发现了一个错误(缺少 parens made field non-nullable 而不是 nullable),所以在修复它之后,我尝试做 php artisan migrate:refresh
我遇到了几个错误,所以我(错误地)决定通过删除 tables(使用 PostgreSQL Studio,通过 Heroku)来进入一个新状态,但是 现在我陷入了一种奇怪的状态:
- 当我尝试 php artisan migrate 或 php artisan migrate --force 时,它显示 "Nothing to migrate"。
- 但是当我尝试回滚或重置或刷新时,出现错误:
未定义 table:关系 'users' 不存在(SQL:更改 table "users" 删除约束 person_id)
那个错误来自那个添加外键的迁移脚本 - 我从这里得到了整体语法 - (http://laravel.com/docs/5.0/schema#foreign-keys)- 如果错误请大声说出来:
class AddConstraintToUsers extends Migration
{
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->foreign('person_id')
->references('id')
->on('people');
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropForeign('person_id');
});
}
}
更多信息: 根据下面的评论,我从迁移 table 中删除了行,因此它们不会被列为已经 运行(希望对 "Nothing to migrate" 有所帮助)。这样做并尝试 php artisan 迁移后,我得到了上面提到的相同的“关系 "users" 不存在”错误,现在迁移 table 显示 'batch' create_users_table 的值为 1,所有其他值为 2。
更疯狂:因为 artisan 运行 的迁移是有序的,并且认为它与 运行 无关(但已被阻止创建用户 table),我创建了一个新的迁移脚本来最后执行,其中的内容正在创建用户 table。至少它不再告诉我 'Nothing to migrate',但它给出了另一个 table(称为 'updates')的 'duplicate table' 错误,而不是我实际尝试创建两次的错误:p
我怎样才能回到正常的地方-(artisan 发现我的迁移脚本到 运行 是新鲜的,或者停止尝试回滚 table 的更改不再存在)- 我保证我已经吸取了教训,不要放弃 tables。不幸的是,这个问题看起来比平时 less-google-able(或者我没有使用正确的术语)- 非常感谢任何帮助!
最后,出路是也删除迁移 table(不知道为什么删除其中的所有行还不够,但至少我现在又回来了) :
- 我删除了数据库中的所有 table,包括迁移 table
- 我像这样用 artisan 重新创建了迁移 table:php artisan migrate:install
- 然后迁移运行成功,没问题:phpartisan:migrate
一切恢复正常 - 万岁!
我正在使用 laravel 5 进行我的第一个项目。我所有的迁移脚本都会创建 tables,除了之后添加外键约束的脚本(因此两个 tables 在 运行s 之前就位)。我在我的一个迁移脚本中发现了一个错误(缺少 parens made field non-nullable 而不是 nullable),所以在修复它之后,我尝试做 php artisan migrate:refresh
我遇到了几个错误,所以我(错误地)决定通过删除 tables(使用 PostgreSQL Studio,通过 Heroku)来进入一个新状态,但是 现在我陷入了一种奇怪的状态:
- 当我尝试 php artisan migrate 或 php artisan migrate --force 时,它显示 "Nothing to migrate"。
- 但是当我尝试回滚或重置或刷新时,出现错误: 未定义 table:关系 'users' 不存在(SQL:更改 table "users" 删除约束 person_id)
那个错误来自那个添加外键的迁移脚本 - 我从这里得到了整体语法 - (http://laravel.com/docs/5.0/schema#foreign-keys)- 如果错误请大声说出来:
class AddConstraintToUsers extends Migration
{
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->foreign('person_id')
->references('id')
->on('people');
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropForeign('person_id');
});
}
}
更多信息: 根据下面的评论,我从迁移 table 中删除了行,因此它们不会被列为已经 运行(希望对 "Nothing to migrate" 有所帮助)。这样做并尝试 php artisan 迁移后,我得到了上面提到的相同的“关系 "users" 不存在”错误,现在迁移 table 显示 'batch' create_users_table 的值为 1,所有其他值为 2。
更疯狂:因为 artisan 运行 的迁移是有序的,并且认为它与 运行 无关(但已被阻止创建用户 table),我创建了一个新的迁移脚本来最后执行,其中的内容正在创建用户 table。至少它不再告诉我 'Nothing to migrate',但它给出了另一个 table(称为 'updates')的 'duplicate table' 错误,而不是我实际尝试创建两次的错误:p
我怎样才能回到正常的地方-(artisan 发现我的迁移脚本到 运行 是新鲜的,或者停止尝试回滚 table 的更改不再存在)- 我保证我已经吸取了教训,不要放弃 tables。不幸的是,这个问题看起来比平时 less-google-able(或者我没有使用正确的术语)- 非常感谢任何帮助!
最后,出路是也删除迁移 table(不知道为什么删除其中的所有行还不够,但至少我现在又回来了) :
- 我删除了数据库中的所有 table,包括迁移 table
- 我像这样用 artisan 重新创建了迁移 table:php artisan migrate:install
- 然后迁移运行成功,没问题:phpartisan:migrate
一切恢复正常 - 万岁!