迁移错误后处于带有外键的奇怪状态

Posted

技术标签:

【中文标题】迁移错误后处于带有外键的奇怪状态【英文标题】:In weird state with foreign key after migrations bug 【发布时间】:2015-12-03 09:29:39 【问题描述】:

我正在使用 laravel 5 处理我的第一个项目。我的所有迁移脚本都会创建表,但之后添加外键约束的表除外(因此两个表在运行之前都已就位)。我在我的一个迁移脚本中发现了一个错误(缺少括号使字段不可为空而不是可空),因此在修复该问题后,我尝试执行 php artisan migrate:refresh

我遇到了几个错误,所以我(错误地)决定通过删除表(使用 PostgreSQL Studio,通过 Heroku)来进入一个新状态,但是 现在我陷入了一个奇怪的状态:

当我尝试 php artisan migrate 或 php artisan migrate --force 时,它​​显示“Nothing to migrate”。 但是当我尝试回滚或重置或刷新时,我收到一个错误: 未定义的表:关系 'users' 不存在(SQL:alter 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');
        );
    


更多信息:根据下面的评论,我从迁移表中删除了这些行,因此它们不会被列为已经运行(希望有助于“无迁移”)。在这样做并尝试 php artisan migrate 之后,我得到了上面提到的相同的“关系“用户”不存在”错误,现在迁移表显示 create_users_table 的“batch”值为 1,其他所有的值为 2。

更疯狂:由于 artisan 按顺序运行迁移并认为它没有什么可运行的(但被阻止创建 users 表),我创建了一个新的迁移脚本来最后执行,其中的内容正在创建该 users 表。至少它不再告诉我“没有要迁移的东西”,但是它为 OTHER 表(称为“更新”)给出了“重复表”错误,而不是我实际上尝试创建两次的错误:p

我怎样才能回到正常的地方-(工匠发现我的迁移脚本可以重新运行,或者停止尝试回滚不再存在的表的更改)-我保证我已经吸取了教训不删除表。不幸的是,看起来这个问题比平常更不适合谷歌(或者我没有使用正确的术语) - 非常感谢任何帮助!

【问题讨论】:

应该有一个名为migrations的表,在最坏的情况下,您可以手动删除那里的迁移,直到您到达您想要的位置(或您的表现在的状态) 你试过 php artisan migrate:rollback 吗? Peyman-是的-(我将在上面的第二个项目符号中添加回滚)-不幸的是,它给了我“表不存在”错误。 Ciccio-很高兴知道!这听起来确实像“最坏的情况”,所以我会在从该表中删除行之前继续寻找更长的时间 Ciccio:我现在尝试了您的建议 - 感谢您的帮助。不幸的是,它并没有工匠认为迁移没有运行。现在,除了第一个迁移(创建用户表)之外,所有迁移的“批处理”值都是 2——这是否给我们提供了任何新信息?在上面的注释中更新... 在删除所有迁移行之前,您是否(如果没有敏感数据)删除了所有表?真正干净的“(重新)开始”。每次运行迁移时,批次 n.o.会增加,所以看起来你执行了两次迁移。如果您确实开始干净,那么上次迁移可能会出错。 【参考方案1】:

最后,出路也是删除迁移表(不知道为什么删除其中的所有行还不够,但至少我现在恢复了业务):

    我删除了数据库中的所有表,包括迁移表 我使用 artisan 重新创建了迁移表,如下所示:php artisan migrate:install 然后迁移成功运行,没问题:php artisan:migrate

一切都恢复正常了——万岁!

【讨论】:

以上是关于迁移错误后处于带有外键的奇怪状态的主要内容,如果未能解决你的问题,请参考以下文章

使用 SequelizeJS 编写带有外键的迁移

创建带有外键的表会出现错误 ORA-00904: : oracle 10g 中的无效标识符 [重复]

插入带有外键的查询

Laravel 数据库迁移外键错误

带有两个外键的 Django 保存表单

Laravel 迁移 - 一般错误:1215 无法添加外键约束