【问题标题】:Migrations - Duplicate key on write or update - Only for Test Env迁移 - 写入或更新时重复键 - 仅适用于测试环境
【发布时间】:2019-06-11 08:29:11
【问题描述】:

我正在进行的一个项目使用 mysql 数据库进行测试和开发(不同的数据库)。运行 php artisan migrate:refresh 时一切正常。

但是,在运行测试时,它无法运行所有迁移并出现以下错误:

Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1005 Can't create table `cmstatic_test`.`#sql-5008_121` (errno: 121 "Duplicate key on write or update") (SQL: alter table `project_user` add constraint `project_user_user_id_foreign` foreign key (`user_id`) references `users` (`id`) on delete cascade)

这是我的向上迁移方法

    public function up()
    {
        Schema::create('project_user', function (Blueprint $table) {

            $table->unsignedBigInteger('project_id');

            $table->foreign('project_id')
                    ->references('id')->on('projects')
                    ->onDelete('cascade');

            $table->unsignedBigInteger('user_id');

            $table->foreign('user_id')
                    ->references('id')->on('users')
                    ->onDelete('cascade');

            $table->unsignedBigInteger('role_id');

            $table->foreign('role_id')
                    ->references('id')->on('roles');
            
            $table->timestamps();
        });
    }

我不明白这个表怎么会有重复的键集。

我的测试看起来像

use Illuminate\Foundation\Testing\RefreshDatabase;

class AuthTest extends TestCase
{
    use RefreshDatabase;

    ...

更新:

如果我删除

$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

测试可以再次运行。但是,我想要那个外键关系-.-

更新2:

我在删除添加外键的行后检查了表结构,显然没有设置外键。所以没有其他迁移在做同样的事情。

【问题讨论】:

  • 您确定错误来自此数据库迁移吗?
  • 如前所述 - 当删除我在“更新”下方发布的行时,它工作正常......这真的很奇怪,我用 laravel 做了很多项目,以前从未有过。
  • 我还尝试将外键定义与表创建分开。还是同样的问题。

标签: laravel


【解决方案1】:

就我而言,我有 2 张桌子

  1. page_translations
  2. pr_page_translations

我在第 1 篇文章中描述了所有症状。我不相信数据库中可能存在“错误”。于是找了找原因。

表 #1 中有一个名为“page_translations_page_id_foreign”的外键。当我尝试将具有相同名称的 FK 添加到 tabe #2 时,我收到了“重复”错误。所以我在表#2“pr_page_translations_page_id_foreign”中为 FK 名称添加了“pr_”前缀。

另一个对我也有用的解决方案是重命名表 #1 中已经存在的 FK。

结论:所有表中的 FK 名称必须是唯一的

在这之后我搜索了解释,这里是:Why do MySQL foreign key constraint names have to be unique?

【讨论】:

  • 这是一个不错的发现!谢谢:)
【解决方案2】:

试试这个:

public function up()
{
    if (!Schema::hasTable('project_user')) {
        Schema::create('project_user', function (Blueprint $table) {
            $table->unsignedBigInteger('project_id');
            $table->foreign('project_id')
                ->references('id')->on('projects')
                ->onDelete('cascade');

            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')
                ->references('id')->on('users')
                ->onDelete('cascade');

            $table->unsignedBigInteger('role_id');
            $table->foreign('role_id')
                ->references('id')->on('roles');
            $table->timestamps();
        });
    }
}

【讨论】:

  • 还是同样的问题
【解决方案3】:

我的数据库本身似乎存在错误。我已经多次删除表并再次尝试,错误仍然存​​在。

但是,删除整个数据库并重新创建它解决了 问题。

这对于遇到此问题的任何人来说可能也会很有趣。

【讨论】:

  • 使用迁移比手动删除要好。有时手动过程会让我们卡在某个地方。
  • 我确实有迁移到删除表。但是删除表格并没有帮助。我不得不删除整个数据库本身。
猜你喜欢
  • 2013-12-29
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2018-03-19
  • 2018-07-04
  • 2016-04-23
  • 1970-01-01
相关资源
最近更新 更多