如何在 Laravel 中处理具有唯一性的迁移回滚中的现有记录?

Posted

技术标签:

【中文标题】如何在 Laravel 中处理具有唯一性的迁移回滚中的现有记录?【英文标题】:How to handle existing records in migration rollback with unique in Laravel? 【发布时间】:2020-01-11 23:11:22 【问题描述】:

我有很多迁移,通常使用“php artisan migrate:refresh”,一切都很好。

由于唯一列的重复条目,我第一次在回滚时遇到错误:

SQLSTATE[23000]:完整性约束违规:1062 键“objects_key_unique”的重复条目“记录”(SQL:alter table `objects` add unique `objects_key_unique`(`key`))

起初该列是唯一的,但在后来的迁移中,我删除了该约束,现在我的数据库中有重复的条目。 由于再次设置了唯一约束的down函数,当我回滚时迁移会引发错误。

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class EditObjectTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::table('objects', function (Blueprint $table) 
            $table->dropUnique(['key']);
        );
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::table('objects', function (Blueprint $table) 
            $table->unique(['key']);
        );
    


我该如何处理? 我不希望该列具有唯一约束,但我也希望回滚而不会出错。 在“EditObjectTable”之后不久,该表在另一个迁移中被删除,所以我在回滚时不需要数据。

【问题讨论】:

还在down函数中添加$table-&gt;dropUnique(['key']); 我认为迁移背后的含义是 up 和 down 函数的作用完全相反。在我的情况下,该表将被删除并且它可能会起作用,但在其他情况下,我的和 createTable 之间可能会有另一次迁移,它假定设置了唯一约束。 您的情况很特殊,我认为您需要删除 down 函数中的唯一约束 【参考方案1】:

我认为你需要检查down删除表迁移文件的方法。我已经测试了你的例子。但它工作正常。如果您将 unique 约束添加到 down 方法中。那么你必须删除unique 约束。

【讨论】:

我之前的迁移,up函数创建表'objects',对'key'具有唯一约束,down函数删除表。所以一个很常见的创建迁移文件。

以上是关于如何在 Laravel 中处理具有唯一性的迁移回滚中的现有记录?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 删除表,迁移不回滚

laravel 迁移:回滚错误

如何使用 Laravel 迁移从列中删除唯一约束?

工匠迁移:laravel 5.3 中的回滚错误

Laravel Cartalyst Sentinel 无法回滚迁移

回滚 laravel5 中的特定迁移