迁移-写入或更新时有重复密钥-仅适用于Test Env

时间:2019-06-11 08:29:11

标签: laravel

我正在研究的项目使用mysql db进行测试和开发(不同的db)。运行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');

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

Update2:

我在删除添加外键的行后检查了表结构,显然未设置外键。因此,没有其他迁移可以做到这一点。

2 个答案:

答案 0 :(得分:0)

尝试一下:

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();
        });
    }
}

答案 1 :(得分:0)

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

  

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

这对于面临此问题的任何人也可能很有趣。