如何在 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->dropUnique(['key']);
我认为迁移背后的含义是 up 和 down 函数的作用完全相反。在我的情况下,该表将被删除并且它可能会起作用,但在其他情况下,我的和 createTable 之间可能会有另一次迁移,它假定设置了唯一约束。
您的情况很特殊,我认为您需要删除 down 函数中的唯一约束
【参考方案1】:
我认为你需要检查down
删除表迁移文件的方法。我已经测试了你的例子。但它工作正常。如果您将 unique
约束添加到 down 方法中。那么你必须删除unique
约束。
【讨论】:
我之前的迁移,up函数创建表'objects',对'key'具有唯一约束,down函数删除表。所以一个很常见的创建迁移文件。以上是关于如何在 Laravel 中处理具有唯一性的迁移回滚中的现有记录?的主要内容,如果未能解决你的问题,请参考以下文章